// ---------------------------------------------------------------------------------------------- // Put 'Image' to window. // ---------------------------------------------------------------------------------------------- void wsImageCreate(wsWindow *win, int w, int h) { #ifdef HAVE_SHM if (wsUseXShm) { win->xImage = XShmCreateImage(wsDisplay, win->VisualInfo.visual, win->VisualInfo.depth, ZPixmap, NULL, &win->Shminfo, w, h); if (win->xImage == NULL) { mp_msg(MSGT_GPLAYER, MSGL_FATAL, MSGTR_WS_ShmError); mplayer(MPLAYER_EXIT_GUI, EXIT_ERROR, 0); } win->Shminfo.shmid = shmget(IPC_PRIVATE, win->xImage->bytes_per_line * win->xImage->height, IPC_CREAT | 0777); if (win->Shminfo.shmid < 0) { XDestroyImage(win->xImage); mp_msg(MSGT_GPLAYER, MSGL_FATAL, MSGTR_WS_ShmError); mplayer(MPLAYER_EXIT_GUI, EXIT_ERROR, 0); } win->Shminfo.shmaddr = (char *)shmat(win->Shminfo.shmid, 0, 0); if (win->Shminfo.shmaddr == ((char *)-1)) { XDestroyImage(win->xImage); if (win->Shminfo.shmaddr != ((char *)-1)) shmdt(win->Shminfo.shmaddr); mp_msg(MSGT_GPLAYER, MSGL_FATAL, MSGTR_WS_ShmError); mplayer(MPLAYER_EXIT_GUI, EXIT_ERROR, 0); } win->xImage->data = win->Shminfo.shmaddr; win->Shminfo.readOnly = False; XShmAttach(wsDisplay, &win->Shminfo); XSync(wsDisplay, False); shmctl(win->Shminfo.shmid, IPC_RMID, 0); } else #endif { win->xImage = XCreateImage(wsDisplay, win->VisualInfo.visual, win->VisualInfo.depth, ZPixmap, 0, 0, w, h, (wsScreenDepth == 3) ? 32 : wsScreenDepth, 0); if ((win->xImage->data = malloc(win->xImage->bytes_per_line * win->xImage->height)) == NULL) { mp_msg(MSGT_GPLAYER, MSGL_FATAL, MSGTR_WS_NotEnoughMemoryDrawBuffer); mplayer(MPLAYER_EXIT_GUI, EXIT_ERROR, 0); } } win->ImageData = (unsigned char *)win->xImage->data; win->ImageDataw = (unsigned short int *)win->xImage->data; win->ImageDatadw = (unsigned int *)win->xImage->data; }
void uiPlaybarInit( void ) { if ( !guiApp.playbarIsPresent ) return; nfree( playbarDrawBuffer ); if ( ( playbarDrawBuffer = malloc( guiApp.playbar.Bitmap.ImageSize ) ) == NULL ) { gmp_msg( MSGT_GPLAYER,MSGL_FATAL,MSGTR_NEMDB ); mplayer( MPLAYER_EXIT_GUI, EXIT_ERROR, 0 ); } guiApp.playbarWindow.Parent=guiApp.subWindow.WindowID; wsCreateWindow( &guiApp.playbarWindow, guiApp.playbar.x,guiApp.playbar.y,guiApp.playbar.width,guiApp.playbar.height, wsNoBorder,wsShowMouseCursor|wsHandleMouseButton|wsHandleMouseMove,wsHideFrame|wsHideWindow,"PlayBar" ); wsSetShape( &guiApp.playbarWindow,guiApp.playbar.Mask.Image ); guiApp.playbarWindow.ReDraw=(void *)uiPlaybarDraw; guiApp.playbarWindow.MouseHandler=uiPlaybarMouseHandle; guiApp.playbarWindow.KeyHandler=uiMainKeyHandle; playbarLength=guiApp.subWindow.Height; }
static void uiVideoDraw( void ) { if ( guiApp.videoWindow.State == wsWindowClosed ) mplayer( MPLAYER_EXIT_GUI, EXIT_QUIT, 0 ); if ( guiApp.videoWindow.State == wsWindowFocusIn ) videoVisible++; if ( guiApp.videoWindow.State == wsWindowFocusOut && metacity_hack != 3 ) videoVisible--; if ( !guiApp.videoWindow.Mapped || guiApp.videoWindow.Visible == wsWindowNotVisible || guiInfo.Playing) return; if ( guiApp.videoWindow.State == wsWindowExpose ) { wsWindowBackground(&guiApp.videoWindow, guiApp.video.R, guiApp.video.G, guiApp.video.B); if ( guiApp.video.Bitmap.Image ) wsImageDraw( &guiApp.videoWindow ); } }
void uiSubDraw( void ) { if ( guiApp.subWindow.State == wsWindowClosed ) mplayer( MPLAYER_EXIT_GUI, EXIT_QUIT, 0 ); if ( guiApp.subWindow.State == wsWindowFocusIn ) subVisible++; if ( guiApp.subWindow.State == wsWindowFocusOut && metacity_hack != 3 ) subVisible--; if ( !guiApp.subWindow.Mapped || guiApp.subWindow.Visible == wsWindowNotVisible ) return; if ( guiInfo.Playing ) uiSubRender=0; if ( uiSubRender && guiApp.subWindow.State == wsWindowExpose ) { if ( guiApp.sub.Bitmap.Image ) wsPutImage( &guiApp.subWindow ); } guiApp.subWindow.State=0; }
void uiMainDraw( void ) { if ( guiApp.mainWindow.State == wsWindowClosed ) mplayer( MPLAYER_EXIT_GUI, EXIT_QUIT, 0 ); if ( guiApp.mainWindow.Visible == wsWindowNotVisible || !mainVisible ) return; // !guiApp.mainWindow.Mapped ) return; if ( uiMainRender && guiApp.mainWindow.State == wsWindowExpose ) { btnModify( evSetMoviePosition,guiInfo.Position ); btnModify( evSetVolume,guiInfo.Volume ); fast_memcpy( mainDrawBuffer,guiApp.main.Bitmap.Image,guiApp.main.Bitmap.ImageSize ); RenderAll( &guiApp.mainWindow,guiApp.mainItems,guiApp.IndexOfMainItems,mainDrawBuffer ); uiMainRender=0; } wsPutImage( &guiApp.mainWindow ); // XFlush( wsDisplay ); }
void uiMainInit (void) { mainDrawBuffer = malloc(guiApp.main.Bitmap.ImageSize); if (!mainDrawBuffer) { gmp_msg(MSGT_GPLAYER, MSGL_FATAL, MSGTR_NEMDB); mplayer(MPLAYER_EXIT_GUI, EXIT_ERROR, 0); } wsWindowCreate(&guiApp.mainWindow, guiApp.main.x, guiApp.main.y, guiApp.main.width, guiApp.main.height, (guiApp.mainDecoration ? wsShowFrame : 0 ) | wsMinSize | wsMaxSize | wsHideWindow, wsShowMouseCursor | wsHandleMouseButton | wsHandleMouseMove, MPlayer); mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[main] mainWindow ID: 0x%x\n", (int) guiApp.mainWindow.WindowID); wsWindowShape(&guiApp.mainWindow, guiApp.main.Mask.Image); wsWindowIcon(wsDisplay, guiApp.mainWindow.WindowID, &guiIcon); wsXDNDMakeAwareness(&guiApp.mainWindow); guiApp.mainWindow.DrawHandler = uiMainDraw; guiApp.mainWindow.MouseHandler = uiMainMouse; guiApp.mainWindow.KeyHandler = uiMainKey; guiApp.mainWindow.DNDHandler = uiMainDND; }
void Manager::StartServer() { //if(!db.Connect(conf.GetDbFile().c_str())) // throw std::runtime_error("Database could not be opened"); #ifndef _REMOTE_MODE Music music; #else BaseMusic music; #endif music.GetList().LoadDir(conf.GetDir()); std::thread mplayer( [&music] { music.PlayList(); } ); if(conf.GetAutostart()) { music.SetStatus(Status::Playing); } CommandControler cmd(music); //FIXME: This should not detach #ifdef _NAMED_PIPE std::thread([&, this](){ while(music.GetStatus() != Status::Exit) ProcessCommand(pipe, cmd); }).detach(); #endif #ifdef _TCP_SOCKET std::thread([&, this](){ while(music.GetStatus() != Status::Exit) ProcessCommand(tcp, cmd); }).detach(); #endif mplayer.join(); }
int main(int argc, char *argv[]) { int fd; pid_t cpid; /* Check for arguments and send to mplayer via FIFO */ mkfifo(FIFO, 0644); if ((fd = open(FIFO, O_WRONLY | O_NONBLOCK)) != -1) { /* mplayer running */ if (argc > 2) dprintf(fd, "%s %s\n", argv[1], argv[2]); else if (argc == 2) dprintf(fd, "%s\n", argv[1]); else dprintf(fd, "pause\n"); close(fd); return 0; } if (argc > 1) return 0; /* Check cache files and update if needed */ setup(); if (!uptodate()) scan(); /* Choose an album */ album = dmenu(0); /* Prompt for filters | mode | trackname, launch mplayer */ if (!strcmp(album, "Jukebox")) { filters = dmenu(1); if (!*filters) { cpid = mplayer(0); /* shuffle all */ } else { filter(); cpid = mplayer(1); /* shuffle playlist */ } } else if (!strcmp(album, "DVD")) { mplayer(2); /* play dvd or die */ } else if (*album) { if (chdir(album) < 0) die("chdir $album failed"); trackname = dmenu(2); if (!strcmp(trackname, "Play")) cpid = mplayer(3); /* play playlist */ else if (!strcmp(trackname, "Shuffle")) cpid = mplayer(1); /* shuffle playlist */ else cpid = mplayer(4); /* play track */ } else { return 0; /* nothing selected */ } /* Loop while playing to save current trackname */ gettrackname(cpid); /* Clean up after mplayer exits */ unlink(PLAYLIST); unlink(STATUSMSG); return 0; }
void uiEventHandling( int msg,float param ) { int iparam = (int)param; mixer_t *mixer = mpctx_get_mixer(guiInfo.mpcontext); switch( msg ) { /* user events */ case evExit: mplayer( MPLAYER_EXIT_GUI, EXIT_QUIT, 0 ); break; case evLoadURL: gtkShow( evLoadURL,NULL ); break; case ivSetAudio: if ( !mpctx_get_demuxer(guiInfo.mpcontext) || audio_id == iparam ) break; mp_property_do("switch_audio",M_PROPERTY_SET,&iparam,guiInfo.mpcontext); break; case ivSetVideo: if ( !mpctx_get_demuxer(guiInfo.mpcontext) || video_id == iparam ) break; mp_property_do("switch_video",M_PROPERTY_SET,&iparam,guiInfo.mpcontext); break; case ivSetSubtitle: mp_property_do("sub",M_PROPERTY_SET,&iparam,guiInfo.mpcontext); break; #ifdef CONFIG_CDDA case ivSetCDTrack: guiInfo.Track=iparam; case evPlayCD: guiInfoMediumClear ( CLEAR_ALL ); guiInfo.StreamType=STREAMTYPE_CDDA; goto play; #endif #ifdef CONFIG_VCD case ivSetVCDTrack: guiInfo.Track=iparam; case evPlayVCD: guiInfoMediumClear ( CLEAR_ALL ); guiInfo.StreamType=STREAMTYPE_VCD; goto play; #endif #ifdef CONFIG_DVDREAD case ivSetDVDSubtitle: dvdsub_id=iparam; uiEventHandling( ivPlayDVD, 0 ); break; case ivSetDVDAudio: audio_id=iparam; uiEventHandling( ivPlayDVD, 0 ); break; case ivSetDVDChapter: guiInfo.Chapter=iparam; uiEventHandling( ivPlayDVD, 0 ); break; case ivSetDVDTitle: guiInfo.Track=iparam; guiInfo.Chapter=1; guiInfo.Angle=1; uiEventHandling( ivPlayDVD, 0 ); break; case evPlayDVD: guiInfo.Track=1; guiInfo.Chapter=1; guiInfo.Angle=1; case ivPlayDVD: guiInfoMediumClear( CLEAR_ALL - CLEAR_DVD ); guiInfo.StreamType=STREAMTYPE_DVD; goto play; #endif case evPlay: case evPlaySwitchToPause: play: if ( ( msg == evPlaySwitchToPause )&&( guiInfo.Playing == GUI_PAUSE ) ) goto NoPause; if ( listMgr( PLAYLIST_ITEM_GET_CURR,0 ) &&( guiInfo.StreamType == STREAMTYPE_FILE ) ) { plItem * next = listMgr( PLAYLIST_ITEM_GET_CURR,0 ); uiSetFileName( next->path,next->name,SAME_STREAMTYPE ); } switch ( guiInfo.StreamType ) { case STREAMTYPE_FILE: case STREAMTYPE_STREAM: case STREAMTYPE_PLAYLIST: guiInfoMediumClear( CLEAR_ALL - CLEAR_FILE ); if ( !guiInfo.Track ) guiInfo.Track=1; guiInfo.NewPlay=GUI_FILE_NEW; break; case STREAMTYPE_CDDA: guiInfoMediumClear( CLEAR_ALL - CLEAR_VCD - CLEAR_FILE ); if ( guiInfo.Playing != GUI_PAUSE ) { if ( !guiInfo.Track ) guiInfo.Track=1; guiInfo.NewPlay=GUI_FILE_SAME; } break; case STREAMTYPE_VCD: guiInfoMediumClear( CLEAR_ALL - CLEAR_VCD - CLEAR_FILE ); if ( guiInfo.Playing != GUI_PAUSE ) { if ( !guiInfo.Track ) guiInfo.Track=2; guiInfo.NewPlay=GUI_FILE_SAME; } break; case STREAMTYPE_DVD: guiInfoMediumClear( CLEAR_ALL - CLEAR_DVD - CLEAR_FILE ); if ( guiInfo.Playing != GUI_PAUSE ) { guiInfo.NewPlay=GUI_FILE_SAME; } break; } uiPlay(); break; case evPause: case evPauseSwitchToPlay: NoPause: uiPause(); break; case evStop: guiInfo.Playing=GUI_STOP; uiState(); break; case evLoadPlay: uiMainAutoPlay=1; // guiInfo.StreamType=STREAMTYPE_FILE; case evLoad: listMgr( PLAYLIST_DELETE,0 ); gtkShow( evLoad,NULL ); break; case evLoadSubtitle: gtkShow( evLoadSubtitle,NULL ); break; case evDropSubtitle: nfree( guiInfo.SubtitleFilename ); mplayerLoadSubtitle( NULL ); break; case evLoadAudioFile: gtkShow( evLoadAudioFile,NULL ); break; case evPrev: uiPrev(); break; case evNext: uiNext(); break; case evPlaylist: gtkShow( evPlaylist,NULL ); break; case evSkinBrowser: gtkShow( evSkinBrowser,skinName ); break; case evAbout: gtkShow( evAbout,NULL ); break; case evPreferences: gtkShow( evPreferences,NULL ); break; case evEqualizer: gtkShow( evEqualizer,NULL ); break; case evForward10min: uiRelSeek( 600 ); break; case evBackward10min: uiRelSeek( -600 );break; case evForward1min: uiRelSeek( 60 ); break; case evBackward1min: uiRelSeek( -60 ); break; case evForward10sec: uiRelSeek( 10 ); break; case evBackward10sec: uiRelSeek( -10 ); break; case evSetMoviePosition: uiAbsSeek( param ); break; case evIncVolume: vo_x11_putkey( wsGrayMul ); break; case evDecVolume: vo_x11_putkey( wsGrayDiv ); break; case evMute: mixer_mute( mixer ); break; case evSetVolume: guiInfo.Volume=param; goto set_volume; case evSetBalance: guiInfo.Balance=param; set_volume: { float l = guiInfo.Volume * ( ( 100.0 - guiInfo.Balance ) / 50.0 ); float r = guiInfo.Volume * ( ( guiInfo.Balance ) / 50.0 ); if ( l > guiInfo.Volume ) l=guiInfo.Volume; if ( r > guiInfo.Volume ) r=guiInfo.Volume; // printf( "!!! v: %.2f b: %.2f -> %.2f x %.2f\n",guiInfo.Volume,guiInfo.Balance,l,r ); mixer_setvolume( mixer,l,r ); } if ( osd_level ) { osd_visible=(GetTimerMS() + 1000) | 1; vo_osd_progbar_type=OSD_VOLUME; vo_osd_progbar_value=( ( guiInfo.Volume ) * 256.0 ) / 100.0; vo_osd_changed( OSDTYPE_PROGBAR ); } break; case evMenu: /*if (guiApp.menuIsPresent) NOTE TO MYSELF: Uncomment only after mouse { pointer and cursor keys work gtkShow( ivHidePopUpMenu,NULL ); with this menu from skin as uiShowMenu( 0,0 ); they do with normal menus. } else*/ gtkShow( ivShowPopUpMenu,NULL ); break; case evIconify: switch ( iparam ) { case 0: wsIconify( guiApp.mainWindow ); break; case 1: wsIconify( guiApp.videoWindow ); break; } break; case evHalfSize: if ( guiInfo.VideoWindow && guiInfo.Playing ) { if ( guiApp.videoWindow.isFullScreen ) { uiFullScreen(); } wsResizeWindow( &guiApp.videoWindow, guiInfo.VideoWidth / 2, guiInfo.VideoHeight / 2 ); wsMoveWindow( &guiApp.videoWindow, False, guiApp.video.x, guiApp.video.y ); btnSet( evFullScreen,btnReleased ); } break; case evDoubleSize: if ( guiInfo.VideoWindow && guiInfo.Playing ) { if ( guiApp.videoWindow.isFullScreen ) { uiFullScreen(); } wsResizeWindow( &guiApp.videoWindow, guiInfo.VideoWidth * 2, guiInfo.VideoHeight * 2 ); wsMoveWindowWithin( &guiApp.videoWindow, False, guiApp.video.x, guiApp.video.y ); btnSet( evFullScreen,btnReleased ); } break; case evNormalSize: if ( guiInfo.VideoWindow && guiInfo.Playing ) { if ( guiApp.videoWindow.isFullScreen ) { uiFullScreen(); } wsResizeWindow( &guiApp.videoWindow, guiInfo.VideoWidth, guiInfo.VideoHeight ); wsMoveWindow( &guiApp.videoWindow, False, guiApp.video.x, guiApp.video.y ); btnSet( evFullScreen,btnReleased ); break; } else if ( !guiApp.videoWindow.isFullScreen ) break; case evFullScreen: if ( guiInfo.VideoWindow && guiInfo.Playing ) { uiFullScreen(); if ( !guiApp.videoWindow.isFullScreen ) { wsResizeWindow( &guiApp.videoWindow, guiInfo.VideoWidth, guiInfo.VideoHeight ); wsMoveWindow( &guiApp.videoWindow, False, guiApp.video.x, guiApp.video.y ); } } if ( guiApp.videoWindow.isFullScreen ) btnSet( evFullScreen,btnPressed ); else btnSet( evFullScreen,btnReleased ); break; case evSetAspect: switch ( iparam ) { case 2: movie_aspect=16.0f / 9.0f; break; case 3: movie_aspect=4.0f / 3.0f; break; case 4: movie_aspect=2.35; break; case 1: default: movie_aspect=-1; } wsClearWindow( guiApp.videoWindow ); if ( guiInfo.StreamType == STREAMTYPE_VCD ) uiEventHandling( evPlayVCD, 0 ); else if ( guiInfo.StreamType == STREAMTYPE_DVD ) uiEventHandling( ivPlayDVD, 0 ); else guiInfo.NewPlay=GUI_FILE_NEW; break; /* timer events */ case ivRedraw: { unsigned now = GetTimerMS(); if ((now > last_redraw_time) && (now < last_redraw_time + GUI_REDRAW_WAIT) && !uiPlaybarFade && (iparam == 0)) break; last_redraw_time = now; } uiMainRender=1; wsPostRedisplay( &guiApp.mainWindow ); wsPostRedisplay( &guiApp.playbarWindow ); break; /* system events */ case evNone: mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[main] uiEventHandling: evNone\n" ); break; default: mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[main] uiEventHandling: unknown event %d, param %.2f\n", msg, param ); break; } }
// ---------------------------------------------------------------------------------------------- // wsWindowCreate: create a new window on the screen. // x,y : window position // w,h : window size // c : mouse cursor visible // p : properties - "decoration", visible titlebar, etc ... // ---------------------------------------------------------------------------------------------- void wsWindowCreate(wsWindow *win, int x, int y, int w, int h, int p, int c, char *label) { int depth; win->Property = p; win->Decoration = ((p & wsShowFrame) != 0); wsWindowUpdatePosition(win, x, y, w, h); win->Width = w; win->Height = h; win->OldX = win->X; win->OldY = win->Y; win->OldWidth = win->Width; win->OldHeight = win->Height; /* Hide Mouse Cursor */ win->wsCursor = None; win->wsMouseEventType = c; win->wsCursorData[0] = 0; win->wsCursorPixmap = XCreateBitmapFromData(wsDisplay, wsRootWin, win->wsCursorData, 1, 1); if (!(c & wsShowMouseCursor)) win->wsCursor = XCreatePixmapCursor(wsDisplay, win->wsCursorPixmap, win->wsCursorPixmap, &win->wsColor, &win->wsColor, 0, 0); depth = vo_find_depth_from_visuals(wsDisplay, wsScreen, NULL); if (depth < 15) { mp_msg(MSGT_GPLAYER, MSGL_FATAL, MSGTR_WS_ColorDepthTooLow); mplayer(MPLAYER_EXIT_GUI, EXIT_ERROR, 0); } XMatchVisualInfo(wsDisplay, wsScreen, depth, TrueColor, &win->VisualInfo); /* --- */ win->AtomLeaderClient = XInternAtom(wsDisplay, "WM_CLIENT_LEADER", False); win->AtomDeleteWindow = XInternAtom(wsDisplay, "WM_DELETE_WINDOW", False); win->AtomTakeFocus = XInternAtom(wsDisplay, "WM_TAKE_FOCUS", False); win->AtomRolle = XInternAtom(wsDisplay, "WM_WINDOW_ROLE", False); win->AtomWMSizeHint = XInternAtom(wsDisplay, "WM_SIZE_HINT", False); win->AtomWMNormalHint = XInternAtom(wsDisplay, "WM_NORMAL_HINT", False); win->AtomProtocols = XInternAtom(wsDisplay, "WM_PROTOCOLS", False); win->AtomsProtocols[0] = win->AtomDeleteWindow; win->AtomsProtocols[1] = win->AtomTakeFocus; win->AtomsProtocols[2] = win->AtomRolle; /* --- */ win->WindowAttrib.border_pixel = WhitePixel(wsDisplay, wsScreen); win->WindowAttrib.colormap = XCreateColormap(wsDisplay, wsRootWin, win->VisualInfo.visual, AllocNone); win->WindowAttrib.event_mask = StructureNotifyMask | FocusChangeMask | ExposureMask | PropertyChangeMask | EnterWindowMask | LeaveWindowMask | VisibilityChangeMask | KeyPressMask | KeyReleaseMask; if ((c & wsHandleMouseButton)) win->WindowAttrib.event_mask |= ButtonPressMask | ButtonReleaseMask; if ((c & wsHandleMouseMove)) win->WindowAttrib.event_mask |= PointerMotionMask; win->WindowAttrib.cursor = win->wsCursor; win->WindowAttrib.override_redirect = False; if (p & wsOverredirect) win->WindowAttrib.override_redirect = True; win->WindowMask = CWBorderPixel | CWColormap | CWEventMask | CWCursor | CWOverrideRedirect; win->WindowID = XCreateWindow(wsDisplay, (win->Parent != 0 ? win->Parent : wsRootWin), win->X, win->Y, win->Width, win->Height, 0, win->VisualInfo.depth, InputOutput, win->VisualInfo.visual, win->WindowMask, &win->WindowAttrib); wsClassHint.res_name = "MPlayer"; wsClassHint.res_class = "MPlayer"; XSetClassHint(wsDisplay, win->WindowID, &wsClassHint); wsWindowSizeHint(win); win->WMHints.flags = InputHint | StateHint; win->WMHints.input = True; win->WMHints.initial_state = NormalState; XSetWMHints(wsDisplay, win->WindowID, &win->WMHints); wsWindowDecoration(win); XStoreName(wsDisplay, win->WindowID, label); XmbSetWMProperties(wsDisplay, win->WindowID, label, label, NULL, 0, NULL, NULL, NULL); XSetWMProtocols(wsDisplay, win->WindowID, win->AtomsProtocols, 3); XChangeProperty(wsDisplay, win->WindowID, win->AtomLeaderClient, XA_WINDOW, 32, PropModeReplace, (unsigned char *)&LeaderWindow, 1); wsTextProperty.value = label; wsTextProperty.encoding = XA_STRING; wsTextProperty.format = 8; wsTextProperty.nitems = strlen(label); XSetWMIconName(wsDisplay, win->WindowID, &wsTextProperty); win->wGC = XCreateGC(wsDisplay, win->WindowID, 0, NULL); win->Visible = wsNo; win->Focused = wsNo; win->Mapped = wsNo; win->Rolled = wsNo; if (p & wsShowWindow) { XMapWindow(wsDisplay, win->WindowID); wsWindowMapWait(win); } wsImageCreate(win, win->Width, win->Height); /* End of creating -------------------------------------------------------------------------- */ { int i; for (i = 0; i < wsWLCount; i++) if (wsWindowList[i] == NULL) break; if (i == wsWLCount) { mp_msg(MSGT_GPLAYER, MSGL_FATAL, MSGTR_WS_TooManyOpenWindows); mplayer(MPLAYER_EXIT_GUI, EXIT_ERROR, 0); } wsWindowList[i] = win; } XFlush(wsDisplay); XSync(wsDisplay, False); win->DrawHandler = NULL; win->MouseHandler = NULL; win->KeyHandler = NULL; mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[ws] window is created. ( %s ).\n", label); }
/** * @brief Issue a command to the GUI. * * @note The GUI is controlled by giving it commands. * * @param what command to be performed * @param data pointer to data needed for the command * * @return #True (ok) or #False (error) */ int gui(int what, void *data) { static float last_balance = -1.0f; #ifdef CONFIG_DVDREAD dvd_priv_t *dvd; #endif int idata = (intptr_t)data, msg, state; stream_t *stream = NULL; sh_audio_t *sh_audio; mixer_t *mixer; float l, r, b; plItem *next = NULL; switch (what) { case GUI_SET_CONTEXT: guiInfo.mpcontext = data; break; case GUI_SET_STATE: switch (idata) { case GUI_STOP: case GUI_PLAY: // if ( !gtkShowVideoWindow ) wsWindowVisibility( &guiApp.videoWindow,wsHideWindow ); case GUI_PAUSE: guiInfo.Playing = idata; break; } uiState(); break; case GUI_REDRAW: uiEvent(ivRedraw, 0); if (!guiInfo.Playing || !guiInfo.VideoWindow) wsEvents(); /* else it's handled by the vo driver calling GUI_HANDLE_X_EVENT */ wsMouseAutohide(); gtkEvents(); break; case GUI_RUN_COMMAND: mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[interface] GUI_RUN_COMMAND: %d\n", idata); switch (idata) { case MP_CMD_VO_FULLSCREEN: uiEvent(evFullScreen, True); break; case MP_CMD_PLAY_TREE_STEP: uiEvent(evNext, 0); break; case -MP_CMD_PLAY_TREE_STEP: uiEvent(evPrev, 0); break; case MP_CMD_STOP: uiEvent(evStop, 0); break; case MP_CMD_QUIT: uiEvent(evExit, 0); break; } break; case GUI_RUN_MESSAGE: mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[interface] GUI_RUN_MESSAGE: %s\n", (const char *)data); msg = appFindMessage((const char *)data); if ((msg == evMenu) || appFindItem(msg)) uiEvent(msg, 0); break; case GUI_PREPARE: uiEvent(ivRedraw, True); wsMouseVisibility(&guiApp.videoWindow, wsHideMouseCursor); usec_sleep(20000); wsEvents(); if (guiInfo.MediumChanged == GUI_MEDIUM_NEW) { audio_id = -1; video_id = -1; dvdsub_id = -1; vobsub_id = -1; stream_cache_size = -1; autosync = 0; force_fps = 0; } switch (guiInfo.StreamType) { case STREAMTYPE_FILE: case STREAMTYPE_STREAM: filename = guiInfo.Filename; break; case STREAMTYPE_CDDA: { char tmp[512]; sprintf(tmp, "cdda://%d", guiInfo.Track); uiSetFile(NULL, tmp, SAME_STREAMTYPE); } break; case STREAMTYPE_VCD: { char tmp[512]; sprintf(tmp, "vcd://%d", guiInfo.Track); uiSetFile(NULL, tmp, SAME_STREAMTYPE); } break; case STREAMTYPE_DVD: { char tmp[512]; sprintf(tmp, "dvd://%d", guiInfo.Track); uiSetFile(NULL, tmp, SAME_STREAMTYPE); } #ifdef CONFIG_DVDREAD dvd_chapter = guiInfo.Chapter; dvd_angle = guiInfo.Angle; #endif break; case STREAMTYPE_TV: case STREAMTYPE_DVB: { char tmp[512]; sprintf(tmp, "%s://", guiTV[gui_tv_digital].SchemeName); uiSetFile(NULL, tmp, SAME_STREAMTYPE); } } /* video opts */ if (!video_driver_list) { int i = 0; while (video_out_drivers[i++]) { if (video_out_drivers[i - 1]->control(VOCTRL_GUISUPPORT, NULL) == VO_TRUE) { listSet(&video_driver_list, video_out_drivers[i - 1]->info->short_name); break; } } } if (!video_driver_list && !video_driver_list[0]) { gmp_msg(MSGT_GPLAYER, MSGL_FATAL, MSGTR_GUI_MSG_VideoOutError); mplayer(MPLAYER_EXIT_GUI, EXIT_ERROR, 0); } { int i = 0; guiInfo.VideoWindow = False; while (video_out_drivers[i++]) { if ((video_driver_list && !gstrcmp(video_driver_list[0], video_out_drivers[i - 1]->info->short_name)) && (video_out_drivers[i - 1]->control(VOCTRL_GUISUPPORT, NULL) == VO_TRUE)) { guiInfo.VideoWindow = True; break; } } } if (video_driver_list && !gstrcmp(video_driver_list[0], "dxr3")) if (guiInfo.StreamType != STREAMTYPE_DVD && guiInfo.StreamType != STREAMTYPE_VCD) if (gtkVfLAVC) add_vf("lavc", NULL); if (gtkVfPP) add_vf("pp", NULL); switch (guiInfo.Rotation) { static const char *argvf[] = { "_oldargs_", NULL, NULL }; case -1: remove_vf("rotate"); remove_vf("flip"); remove_vf("mirror"); break; case 1: argvf[1] = "1"; add_vf("rotate", argvf); remove_vf("flip"); remove_vf("mirror"); break; case 2: argvf[1] = "2"; add_vf("rotate", argvf); remove_vf("flip"); remove_vf("mirror"); break; case 8: remove_vf("rotate"); add_vf("flip", NULL); add_vf("mirror", NULL); break; } /* audio opts */ // if ( ao_plugin_cfg.plugin_list ) { free( ao_plugin_cfg.plugin_list ); ao_plugin_cfg.plugin_list=NULL; } if (gtkAONorm) listRepl(&af_cfg.list, "volnorm", "volnorm"); if (gtkEnableAudioEqualizer) listRepl(&af_cfg.list, "equalizer", "equalizer"); if (gtkAOExtraStereo) { char *name; name = malloc(12 + 20 + 1); snprintf(name, 12 + 20, "extrastereo=%f", gtkAOExtraStereoMul); name[12 + 20] = 0; listRepl(&af_cfg.list, "extrastereo", name); free(name); } if (audio_driver_list && !gstrncmp(audio_driver_list[0], "oss", 3)) { mixer_device = gtkAOOSSMixer; mixer_channel = gtkAOOSSMixerChannel; if (gtkAOOSSDevice) { char *tmp; tmp = calloc(1, strlen(gtkAOOSSDevice) + 7); sprintf(tmp, "oss:%s", gtkAOOSSDevice); listSet(&audio_driver_list, tmp); free(tmp); } } if (audio_driver_list && !gstrncmp(audio_driver_list[0], "alsa", 4)) { mixer_device = gtkAOALSAMixer; mixer_channel = gtkAOALSAMixerChannel; if (gtkAOALSADevice) { char *tmp; tmp = calloc(1, strlen(gtkAOALSADevice) + 14); sprintf(tmp, "alsa:device=%s", gtkAOALSADevice); listSet(&audio_driver_list, tmp); free(tmp); } } if (audio_driver_list && !gstrncmp(audio_driver_list[0], "sdl", 3)) { if (gtkAOSDLDriver) { char *tmp; tmp = calloc(1, strlen(gtkAOSDLDriver) + 10); sprintf(tmp, "sdl:%s", gtkAOSDLDriver); listSet(&audio_driver_list, tmp); free(tmp); } } if (audio_driver_list && !gstrncmp(audio_driver_list[0], "esd", 3)) { if (gtkAOESDDevice) { char *tmp; tmp = calloc(1, strlen(gtkAOESDDevice) + 10); sprintf(tmp, "esd:%s", gtkAOESDDevice); listSet(&audio_driver_list, tmp); free(tmp); } } /* subtitle */ // subdata->filename=gstrdup( guiInfo.SubtitleFilename ); stream_dump_type = 0; if (gtkSubDumpMPSub) stream_dump_type = 4; if (gtkSubDumpSrt) stream_dump_type = 6; gtkSubDumpMPSub = gtkSubDumpSrt = False; /* misc */ if (gtkCacheOn) stream_cache_size = gtkCacheSize; if (gtkAutoSyncOn) autosync = gtkAutoSync; if (guiInfo.AudioFilename) audio_stream = gstrdup(guiInfo.AudioFilename); else if (guiInfo.MediumChanged == GUI_MEDIUM_NEW) nfree(audio_stream); // audio_stream = NULL; guiInfo.MediumChanged = False; ass_enabled = gtkASS.enabled; ass_use_margins = gtkASS.use_margins; ass_top_margin = gtkASS.top_margin; ass_bottom_margin = gtkASS.bottom_margin; break; case GUI_SET_STREAM: if (guiInfo.StreamType == STREAMTYPE_PLAYLIST) guiInfo.mpcontext->file_format = DEMUXER_TYPE_PLAYLIST; else { stream = data; guiInfo.StreamType = stream->type; } switch (guiInfo.StreamType) { case STREAMTYPE_FILE: case STREAMTYPE_STREAM: guiInfo.Tracks = (uintptr_t)listMgr(PLAYLIST_ITEM_GET_POS, 0); break; case STREAMTYPE_CDDA: guiInfo.Tracks = 0; stream_control(stream, STREAM_CTRL_GET_NUM_TITLES, &guiInfo.Tracks); if (stream_control(stream, STREAM_CTRL_GET_CURRENT_TITLE, &guiInfo.Track) == STREAM_OK) guiInfo.Track++; break; case STREAMTYPE_VCD: guiInfo.Tracks = 0; stream_control(stream, STREAM_CTRL_GET_NUM_TITLES, &guiInfo.Tracks); if (stream_control(stream, STREAM_CTRL_GET_CURRENT_TITLE, &guiInfo.Track) == STREAM_OK) guiInfo.Track++; break; case STREAMTYPE_DVD: guiInfo.Tracks = 0; stream_control(stream, STREAM_CTRL_GET_NUM_TITLES, &guiInfo.Tracks); guiInfo.Chapters = 0; stream_control(stream, STREAM_CTRL_GET_NUM_CHAPTERS, &guiInfo.Chapters); guiInfo.Angles = 0; stream_control(stream, STREAM_CTRL_GET_NUM_ANGLES, &guiInfo.Angles); if (stream_control(stream, STREAM_CTRL_GET_CURRENT_TITLE, &guiInfo.Track) == STREAM_OK) guiInfo.Track++; // guiInfo.Chapter will be set by mplayer guiInfo.Angle = 1; stream_control(stream, STREAM_CTRL_GET_ANGLE, &guiInfo.Angle); #ifdef CONFIG_DVDREAD dvd = stream->priv; guiInfo.AudioStreams = dvd->nr_of_channels; memcpy(guiInfo.AudioStream, dvd->audio_streams, sizeof(dvd->audio_streams)); guiInfo.Subtitles = dvd->nr_of_subtitles; memcpy(guiInfo.Subtitle, dvd->subtitles, sizeof(dvd->subtitles)); #endif break; case STREAMTYPE_TV: case STREAMTYPE_DVB: guiInfo.Tracks = guiInfo.Track = 1; break; } break; case GUI_SET_VIDEO: /* video */ guiInfo.sh_video = data; nfree(guiInfo.CodecName); if (guiInfo.sh_video) guiInfo.CodecName = strdup(guiInfo.sh_video->codec->name); state = (isSeekableStreamtype ? btnReleased : btnDisabled); btnSet(evForward10sec, state); btnSet(evBackward10sec, state); btnSet(evForward1min, state); btnSet(evBackward1min, state); btnSet(evForward10min, state); btnSet(evBackward10min, state); btnSet(evSetMoviePosition, state); if (video_driver_list && !gstrcmp(video_driver_list[0], "dxr3") && (((demuxer_t *)mpctx_get_demuxer(guiInfo.mpcontext))->file_format != DEMUXER_TYPE_MPEG_PS) && !gtkVfLAVC) { gtkMessageBox(MSGBOX_FATAL, MSGTR_GUI_MSG_DXR3NeedsLavc); return False; } break; case GUI_SET_AUDIO: sh_audio = data; if (sh_audio) { guiInfo.AudioChannels = sh_audio->channels; guiInfo.AudioPassthrough = (gstrcmp(sh_audio->ad_driver->info->short_name, "hwac3") == 0); if (!guiInfo.sh_video) { guiInfo.VideoWindow = False; guiInfo.VideoWidth = 0; guiInfo.VideoHeight = 0; } } else { guiInfo.AudioChannels = 0; guiInfo.AudioPassthrough = False; } if (guiInfo.AudioPassthrough) btnSet(evSetVolume, btnDisabled); if (guiInfo.AudioChannels < 2 || guiInfo.AudioPassthrough) btnSet(evSetBalance, btnDisabled); if (last_balance < 0.0f) { uiEvent(ivSetVolume, guiInfo.Volume); if (guiInfo.AudioChannels == 2 && !guiInfo.AudioPassthrough) uiEvent(ivSetBalance, guiInfo.Balance); last_balance = guiInfo.Balance; } if (gtkEnableAudioEqualizer) { equalizer_t eq; unsigned int i, j; for (i = 0; i < FF_ARRAY_ELEMS(gtkEquChannels); i++) { for (j = 0; j < FF_ARRAY_ELEMS(*gtkEquChannels); j++) { eq.channel = i; eq.band = j; eq.gain = gtkEquChannels[i][j]; mplayer(MPLAYER_SET_EQUALIZER, 0, &eq); } } } // These must be done here (in the last call from MPlayer before // playback starts) and not in GUI_SETUP_VIDEO_WINDOW, because... // ...without video there will be no call to GUI_SETUP_VIDEO_WINDOW if (!guiInfo.VideoWindow) { wsWindowVisibility(&guiApp.videoWindow, wsHideWindow); btnSet(evFullScreen, gtkLoadFullscreen ? btnPressed : btnReleased); } // ...option variable fullscreen determines whether MPlayer will handle // the window given by WinID as fullscreen window (and will do aspect // scaling then) or not - quite rubbish fullscreen = gtkLoadFullscreen; break; case GUI_SET_VOLUME_BALANCE: mixer = data; mixer_getvolume(mixer, &l, &r); guiInfo.Volume = FFMAX(l, r); mixer_getbalance(mixer, &b); guiInfo.Balance = (b + 1.0) * 50.0; // transform -1..1 to 0..100 if (guiInfo.Balance != last_balance) { uiEvent(ivSetVolume, guiInfo.Volume); last_balance = guiInfo.Balance; } break; case GUI_SETUP_VIDEO_WINDOW: guiInfo.VideoWidth = vo_dwidth; guiInfo.VideoHeight = vo_dheight; if (!guiApp.videoWindow.isFullScreen || !guiApp.videoWindow.Mapped) { if (!guiApp.videoWindow.isFullScreen) wsWindowResize(&guiApp.videoWindow, guiInfo.VideoWidth, guiInfo.VideoHeight); if (!guiApp.videoWindow.Mapped) wsWindowVisibility(&guiApp.videoWindow, wsShowWindow); } if (gtkLoadFullscreen ^ guiApp.videoWindow.isFullScreen) uiEvent(evFullScreen, True); if (guiWinID >= 0) wsWindowMove(&guiApp.mainWindow, True, 0, guiInfo.VideoHeight); wsWindowBackground(&guiApp.videoWindow, -1, -1, -1); break; case GUI_HANDLE_X_EVENT: wsEvent(data); break; case GUI_END_PLAY: guiInfo.sh_video = NULL; btnSet(evSetVolume, btnReleased); btnSet(evSetBalance, btnReleased); uiEvent(ivRedraw, True); if (guiInfo.Playing) { if (!guiInfo.PlaylistNext) { guiInfo.PlaylistNext = True; break; } if (guiInfo.StreamType == STREAMTYPE_CDDA && guiInfo.Track < guiInfo.Tracks) { uiNext(); break; } next = listMgr(PLAYLIST_ITEM_GET_NEXT, 0); } if (next) { uiSetFile(next->path, next->name, STREAMTYPE_FILE); guiInfo.MediumChanged = GUI_MEDIUM_NEW; guiInfo.Track = (uintptr_t)listMgr(PLAYLIST_ITEM_GET_POS, next); } else { if (guiInfo.MediumChanged == GUI_MEDIUM_NEW) break; filename = NULL; if (isPlaylistStreamtype) { plItem *curr = listMgr(PLAYLIST_ITEM_GET_CURR, 0); if (!curr) uiUnsetFile(); else if ((curr != listMgr(PLAYLIST_GET, 0)) && guiInfo.Playing) { curr = listMgr(PLAYLIST_ITEM_SET_CURR, listMgr(PLAYLIST_GET, 0)); uiSetFile(curr->path, curr->name, STREAMTYPE_FILE); guiInfo.Track = 1; } } else if (guiInfo.Playing) { int first = (guiInfo.StreamType == STREAMTYPE_VCD ? 2 : 1); if (guiInfo.Track != first) { uiUnsetMedia(True); guiInfo.Track = first; } if (guiInfo.StreamType == STREAMTYPE_DVD) { guiInfo.Chapter = 1; guiInfo.Angle = 1; } } guiInfo.ElapsedTime = 0; guiInfo.Position = 0.0f; if (gtkShowVideoWindow) { guiInfo.VideoWindow = True; if (!guiApp.videoWindow.isFullScreen) wsWindowResize(&guiApp.videoWindow, guiApp.video.width, guiApp.video.height); if (!guiApp.videoWindow.Mapped) wsWindowVisibility(&guiApp.videoWindow, wsShowWindow); if (gtkLoadFullscreen ^ guiApp.videoWindow.isFullScreen) uiEvent(evFullScreen, False); } else { wsWindowVisibility(&guiApp.videoWindow, wsHideWindow); guiInfo.VideoWindow = False; btnSet(evFullScreen, gtkLoadFullscreen ? btnPressed : btnReleased); } gui(GUI_SET_STATE, (void *)GUI_STOP); wsWindowRedraw(&guiApp.videoWindow); wsMouseVisibility(&guiApp.videoWindow, wsShowMouseCursor); wsEvents(); } break; } return True; }
/** * @brief Initialize and start the GUI. */ void guiInit(void) { char **argvf; int ret; plItem *playlist; mp_msg(MSGT_GPLAYER, MSGL_V, "GUI init.\n"); /* check options */ if (!cdrom_device) cdrom_device = strdup(DEFAULT_CDROM_DEVICE); if (!dvd_device) dvd_device = strdup(DEFAULT_DVD_DEVICE); #ifdef CONFIG_DXR3 if (!gtkDXR3Device) gtkDXR3Device = strdup("/dev/em8300-0"); #endif if (stream_cache_size > 0) { gtkCacheOn = True; gtkCacheSize = stream_cache_size; } else if (stream_cache_size == 0) gtkCacheOn = False; if (autosync && (autosync != gtkAutoSync)) { gtkAutoSyncOn = True; gtkAutoSync = autosync; } gtkASS.enabled = ass_enabled; gtkASS.use_margins = ass_use_margins; gtkASS.top_margin = ass_top_margin; gtkASS.bottom_margin = ass_bottom_margin; argvf = get_vf("rotate"); guiInfo.Rotation = (argvf && argvf[1] ? atoi(argvf[1]) : -1); /* initialize graphical user interfaces */ wsInit(mDisplay); gtkInit(mDisplayName); /* load skin */ skinDirInHome = get_path("skins"); skinDirInData = MPLAYER_DATADIR "/skins"; mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[interface] skin directory #1: %s\n", skinDirInHome); mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[interface] skin directory #2: %s\n", skinDirInData); if (!skinName) skinName = strdup("default"); ret = skinRead(skinName); if (ret == -1 && strcmp(skinName, "default") != 0) { mp_msg(MSGT_GPLAYER, MSGL_WARN, MSGTR_GUI_MSG_SkinCfgSelectedNotFound, skinName); skinName = strdup("default"); ret = skinRead(skinName); } switch (ret) { case -1: gmp_msg(MSGT_GPLAYER, MSGL_FATAL, MSGTR_GUI_MSG_SkinCfgNotFound, skinName); mplayer(MPLAYER_EXIT_GUI, EXIT_ERROR, 0); case -2: gmp_msg(MSGT_GPLAYER, MSGL_FATAL, MSGTR_GUI_MSG_SkinCfgError, skinName); mplayer(MPLAYER_EXIT_GUI, EXIT_ERROR, 0); } /* initialize windows */ if (gui_save_pos) { if (gui_main_pos_x != -3) guiApp.main.x = gui_main_pos_x; if (gui_main_pos_y != -3) guiApp.main.y = gui_main_pos_y; if (gui_video_pos_x != -3) guiApp.video.x = gui_video_pos_x; if (gui_video_pos_y != -3) guiApp.video.y = gui_video_pos_y; } if (WinID > 0) { guiApp.videoWindow.Parent = WinID; guiApp.video.x = 0; guiApp.video.y = 0; } if (guiWinID >= 0) guiApp.mainWindow.Parent = guiWinID; uiMainInit(); // main window must be first! uiVideoInit(); // video window must be second! uiPlaybarInit(); uiMenuInit(); WinID = (Window)guiApp.videoWindow.WindowID; btnValue(evSetVolume, &guiInfo.Volume); btnValue(evSetBalance, &guiInfo.Balance); btnValue(evSetMoviePosition, &guiInfo.Position); if (guiInfo.Position) uiEvent(evSetMoviePosition, guiInfo.Position); wsWindowVisibility(&guiApp.mainWindow, wsShowWindow); if (gtkShowVideoWindow) { wsWindowVisibility(&guiApp.videoWindow, wsShowWindow); guiInfo.VideoWindow = True; if (gtkLoadFullscreen) uiFullScreen(); } else wsWindowBackground(&guiApp.videoWindow, 0, 0, 0); if (gtkLoadFullscreen) btnSet(evFullScreen, btnPressed); guiInfo.Playing = GUI_STOP; playlist = listMgr(PLAYLIST_ITEM_GET_CURR, 0); if (playlist && !filename) { uiSetFile(playlist->path, playlist->name, STREAMTYPE_FILE); guiInfo.Tracks = (uintptr_t)listMgr(PLAYLIST_ITEM_GET_POS, 0); guiInfo.Track = 1; filename = NULL; // don't start playing } if (subdata) setdup(&guiInfo.SubtitleFilename, subdata->filename); orig_fontconfig = font_fontconfig; set_fontconfig(); guiInitialized = True; }
void mplayer(int what, float value, void *data) { af_stream_t *afilter; equalizer_t *eq = (equalizer_t *)data; switch (what) { /* subtitle */ case MPLAYER_SET_FONT_FACTOR: font_factor = value; mplayer(MPLAYER_LOAD_FONT, 0, 0); break; case MPLAYER_SET_FONT_OUTLINE: subtitle_font_thickness = 8.0 * value / 100.0; // transform 0..100 to 0..8 mplayer(MPLAYER_LOAD_FONT, 0, 0); break; case MPLAYER_SET_FONT_BLUR: subtitle_font_radius = 8.0 * value / 100.0; // transform 0..100 to 0..8 mplayer(MPLAYER_LOAD_FONT, 0, 0); break; case MPLAYER_SET_FONT_TEXTSCALE: text_font_scale_factor = value; mplayer(MPLAYER_LOAD_FONT, 0, 0); break; case MPLAYER_SET_FONT_OSDSCALE: osd_font_scale_factor = value; mplayer(MPLAYER_LOAD_FONT, 0, 0); break; case MPLAYER_SET_FONT_ENCODING: nfree(subtitle_font_encoding); subtitle_font_encoding = gstrdup(data); mplayer(MPLAYER_LOAD_FONT, 0, 0); break; case MPLAYER_SET_FONT_AUTOSCALE: subtitle_autoscale = (int)value; mplayer(MPLAYER_LOAD_FONT, 0, 0); break; case MPLAYER_LOAD_FONT: #ifdef CONFIG_FREETYPE set_fontconfig(); force_load_font = 1; #else free_font_desc(vo_font); if (font_name) { vo_font = read_font_desc(font_name, font_factor, 0); if (!vo_font) gmp_msg(MSGT_GPLAYER, MSGL_ERR, MSGTR_CantLoadFont, font_name); } else { char *fname = get_path("font/font.desc"); setdup(&font_name, fname); free(fname); vo_font = read_font_desc(font_name, font_factor, 0); if (!vo_font) { setdup(&font_name, MPLAYER_DATADIR "/font/font.desc"); vo_font = read_font_desc(font_name, font_factor, 0); } } #endif break; case MPLAYER_SET_SUB_ENCODING: nfree(sub_cp); sub_cp = gstrdup(data); break; case MPLAYER_SET_EXTRA_STEREO: gtkAOExtraStereoMul = value; afilter = mpctx_get_afilter(guiInfo.mpcontext); if (afilter) af_control_any_rev(afilter, AF_CONTROL_ES_MUL | AF_CONTROL_SET, >kAOExtraStereoMul); break; case MPLAYER_SET_PANSCAN: { mp_cmd_t *mp_cmd; mp_cmd = calloc(1, sizeof(*mp_cmd)); mp_cmd->id = MP_CMD_PANSCAN; mp_cmd->name = strdup("panscan"); mp_cmd->args[0].v.f = value; mp_cmd->args[1].v.i = 1; mp_input_queue_cmd(mp_cmd); } break; case MPLAYER_SET_AUTO_QUALITY: auto_quality = (int)value; break; /* set equalizers */ case MPLAYER_SET_CONTRAST: if (guiInfo.sh_video) set_video_colors(guiInfo.sh_video, "contrast", value); break; case MPLAYER_SET_BRIGHTNESS: if (guiInfo.sh_video) set_video_colors(guiInfo.sh_video, "brightness", value); break; case MPLAYER_SET_HUE: if (guiInfo.sh_video) set_video_colors(guiInfo.sh_video, "hue", value); break; case MPLAYER_SET_SATURATION: if (guiInfo.sh_video) set_video_colors(guiInfo.sh_video, "saturation", value); break; case MPLAYER_SET_EQUALIZER: { af_control_ext_t tmp; afilter = mpctx_get_afilter(guiInfo.mpcontext); if (eq) { gtkEquChannels[eq->channel][eq->band] = eq->gain; tmp.ch = eq->channel; tmp.arg = gtkEquChannels[eq->channel]; if (afilter) af_control_any_rev(afilter, AF_CONTROL_EQUALIZER_GAIN | AF_CONTROL_SET, &tmp); } else { unsigned int i; memset(gtkEquChannels, 0, sizeof(gtkEquChannels)); if (afilter) { for (i = 0; i < FF_ARRAY_ELEMS(gtkEquChannels); i++) { tmp.ch = i; tmp.arg = gtkEquChannels[i]; af_control_any_rev(afilter, AF_CONTROL_EQUALIZER_GAIN | AF_CONTROL_SET, &tmp); } } } break; } case MPLAYER_EXIT_GUI: exit_player_with_rc((enum exit_reason)value, (enum exit_reason)value >= EXIT_ERROR); break; } }
void uiEvent(int ev, float param) { int iparam = (int)param; mixer_t *mixer = mpctx_get_mixer(guiInfo.mpcontext); float aspect; char cmd[40]; switch (ev) { /* user events */ case evExit: mplayer(MPLAYER_EXIT_GUI, EXIT_QUIT, 0); break; case evLoadURL: gtkShow(evLoadURL, NULL); break; case ivSetAudio: if (!mpctx_get_demuxer(guiInfo.mpcontext) || audio_id == iparam) break; mp_property_do("switch_audio", M_PROPERTY_SET, &iparam, guiInfo.mpcontext); break; case ivSetVideo: if (!mpctx_get_demuxer(guiInfo.mpcontext) || video_id == iparam) break; mp_property_do("switch_video", M_PROPERTY_SET, &iparam, guiInfo.mpcontext); break; case ivSetSubtitle: mp_property_do("sub", M_PROPERTY_SET, &iparam, guiInfo.mpcontext); break; #ifdef CONFIG_CDDA case ivSetCDTrack: guiInfo.Track = iparam; case evPlayCD: guiInfo.StreamType = STREAMTYPE_CDDA; goto play; #endif #ifdef CONFIG_VCD case ivSetVCDTrack: guiInfo.Track = iparam; case evPlayVCD: guiInfo.StreamType = STREAMTYPE_VCD; goto play; #endif #ifdef CONFIG_DVDREAD case ivSetDVDSubtitle: dvdsub_id = iparam; uiEvent(ivPlayDVD, 0); break; case ivSetDVDAudio: audio_id = iparam; uiEvent(ivPlayDVD, 0); break; case ivSetDVDChapter: guiInfo.Chapter = iparam; uiEvent(ivPlayDVD, 0); break; case ivSetDVDTitle: guiInfo.Track = iparam; guiInfo.Chapter = 1; guiInfo.Angle = 1; uiEvent(ivPlayDVD, 0); break; case evPlayDVD: guiInfo.Chapter = 1; guiInfo.Angle = 1; case ivPlayDVD: guiInfo.StreamType = STREAMTYPE_DVD; goto play; #endif #ifdef CONFIG_TV case evPlayTV: guiInfo.StreamType = guiTV[gui_tv_digital].StreamType; goto play; #endif case evPlay: case evPlaySwitchToPause: play: if (guiInfo.Playing != GUI_PAUSE) { MediumPrepare(guiInfo.StreamType); switch (guiInfo.StreamType) { case STREAMTYPE_FILE: case STREAMTYPE_STREAM: case STREAMTYPE_PLAYLIST: if (!guiInfo.Track) guiInfo.Track = 1; guiInfo.MediumChanged = GUI_MEDIUM_NEW; guiInfo.PlaylistNext = !guiInfo.Playing; break; case STREAMTYPE_CDDA: case STREAMTYPE_VCD: case STREAMTYPE_DVD: case STREAMTYPE_TV: case STREAMTYPE_DVB: if (!guiInfo.Track) guiInfo.Track = (guiInfo.StreamType == STREAMTYPE_VCD ? 2 : 1); case STREAMTYPE_BINCUE: // track 0 is OK and will auto-select first media data track guiInfo.MediumChanged = GUI_MEDIUM_SAME; break; } } uiPlay(); break; case evPause: case evPauseSwitchToPlay: uiPause(); break; case evStop: guiInfo.Playing = GUI_STOP; uiState(); break; case evLoadPlay: uiLoadPlay = True; // guiInfo.StreamType=STREAMTYPE_FILE; case evLoad: gtkShow(evLoad, NULL); break; case evLoadSubtitle: gtkShow(evLoadSubtitle, NULL); break; case evDropSubtitle: nfree(guiInfo.SubtitleFilename); mplayerLoadSubtitle(NULL); break; case evLoadAudioFile: gtkShow(evLoadAudioFile, NULL); break; case evPlayImage: gtkShow(evPlayImage, NULL); break; case evPrev: uiPrev(); break; case evNext: uiNext(); break; case evPlaylist: gtkShow(evPlaylist, NULL); break; case evSkinBrowser: gtkShow(evSkinBrowser, skinName); break; case evAbout: gtkShow(evAbout, NULL); break; case evPreferences: gtkShow(evPreferences, NULL); break; case evEqualizer: gtkShow(evEqualizer, NULL); break; case evForward10min: uiRelSeek(600); break; case evBackward10min: uiRelSeek(-600); break; case evForward1min: uiRelSeek(60); break; case evBackward1min: uiRelSeek(-60); break; case evForward10sec: uiRelSeek(10); break; case evBackward10sec: uiRelSeek(-10); break; case evSetMoviePosition: guiInfo.Position = param; uiPctSeek(guiInfo.Position); break; case evIncVolume: mplayer_put_key(KEY_VOLUME_UP); break; case evDecVolume: mplayer_put_key(KEY_VOLUME_DOWN); break; case evMute: mixer_mute(mixer); break; case evSetVolume: case ivSetVolume: guiInfo.Volume = param; { float l = guiInfo.Volume * (100.0 - guiInfo.Balance) / 50.0; float r = guiInfo.Volume * guiInfo.Balance / 50.0; mixer_setvolume(mixer, FFMIN(l, guiInfo.Volume), FFMIN(r, guiInfo.Volume)); } if (ev == ivSetVolume) break; if (osd_level) { osd_visible = (GetTimerMS() + 1000) | 1; vo_osd_progbar_type = OSD_VOLUME; vo_osd_progbar_value = guiInfo.Volume * 256.0 / 100.0; vo_osd_changed(OSDTYPE_PROGBAR); } break; case evSetBalance: case ivSetBalance: guiInfo.Balance = param; mixer_setbalance(mixer, (guiInfo.Balance - 50.0) / 50.0); // transform 0..100 to -1..1 uiEvent(ivSetVolume, guiInfo.Volume); if (ev == ivSetBalance) break; if (osd_level) { osd_visible = (GetTimerMS() + 1000) | 1; vo_osd_progbar_type = OSD_BALANCE; vo_osd_progbar_value = guiInfo.Balance * 256.0 / 100.0; vo_osd_changed(OSDTYPE_PROGBAR); } break; case evMenu: /*if (guiApp.menuIsPresent) NOTE TO MYSELF: Uncomment only after mouse * { pointer and cursor keys work * gtkShow( ivHidePopUpMenu,NULL ); with this menu from skin as * uiMenuShow( 0,0 ); they do with normal menus. * } * else*/gtkShow(ivShowPopUpMenu, NULL); break; case evIconify: switch (iparam) { case 0: wsWindowIconify(&guiApp.mainWindow); break; case 1: wsWindowIconify(&guiApp.videoWindow); break; } break; case evHalfSize: if (guiInfo.VideoWindow && guiInfo.Playing) { if (guiApp.videoWindow.isFullScreen) { uiFullScreen(); } wsWindowResize(&guiApp.videoWindow, guiInfo.VideoWidth / 2, guiInfo.VideoHeight / 2); btnSet(evFullScreen, btnReleased); } break; case evDoubleSize: if (guiInfo.VideoWindow && guiInfo.Playing) { if (guiApp.videoWindow.isFullScreen) { uiFullScreen(); } wsWindowResize(&guiApp.videoWindow, guiInfo.VideoWidth * 2, guiInfo.VideoHeight * 2); wsWindowMoveWithin(&guiApp.videoWindow, False, guiApp.video.x, guiApp.video.y); btnSet(evFullScreen, btnReleased); } break; case evNormalSize: if (guiInfo.VideoWindow && guiInfo.Playing) { if (guiApp.videoWindow.isFullScreen) { uiFullScreen(); } wsWindowResize(&guiApp.videoWindow, guiInfo.VideoWidth, guiInfo.VideoHeight); btnSet(evFullScreen, btnReleased); break; } else if (!guiApp.videoWindow.isFullScreen) break; case evFullScreen: if (guiInfo.VideoWindow && (guiInfo.Playing || !iparam)) { uiFullScreen(); if (!guiApp.videoWindow.isFullScreen) wsWindowResize(&guiApp.videoWindow, iparam ? guiInfo.VideoWidth : guiApp.video.width, iparam ? guiInfo.VideoHeight : guiApp.video.height); } if (guiApp.videoWindow.isFullScreen) btnSet(evFullScreen, btnPressed); else btnSet(evFullScreen, btnReleased); break; case evSetAspect: switch (iparam) { case 2: aspect = 16.0f / 9.0f; break; case 3: aspect = 4.0f / 3.0f; break; case 4: aspect = 2.35f; break; case 1: default: aspect = -1; break; } snprintf(cmd, sizeof(cmd), "pausing_keep switch_ratio %f", aspect); mp_input_queue_cmd(mp_input_parse_cmd(cmd)); break; case evSetRotation: switch (iparam) { case 90: guiInfo.Rotation = 1; break; case -90: guiInfo.Rotation = 2; break; case 180: guiInfo.Rotation = 8; break; case 0: default: guiInfo.Rotation = -1; break; } guiInfo.MediumChanged = GUI_MEDIUM_SAME; break; /* timer events */ case ivRedraw: { unsigned int now = GetTimerMS(); if ((now > last_redraw_time) && (now < last_redraw_time + GUI_REDRAW_WAIT) && !uiPlaybarFade && (iparam == 0)) break; last_redraw_time = now; } uiMainRender = True; wsWindowRedraw(&guiApp.mainWindow); wsWindowRedraw(&guiApp.playbarWindow); break; /* system events */ case evNone: mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[actions] uiEvent: evNone\n"); break; default: mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[actions] uiEvent: unknown event %d, param %.2f\n", ev, param); break; } }
/** * @brief Change to a different skin. * * @param name name of the skin to change to */ void uiChangeSkin(char *name) { int was_menu, was_playbar; was_menu = guiApp.menuIsPresent; was_playbar = guiApp.playbarIsPresent; mainVisible = False; if (skinRead(name) != 0) { if (skinRead(skinName) != 0) { gmp_msg(MSGT_GPLAYER, MSGL_FATAL, MSGTR_GUI_MSG_SkinCfgError, skinName); mplayer(MPLAYER_EXIT_GUI, EXIT_ERROR, 0); } } /* reload main window (must be first!) */ uiMainDone(); uiMainInit(); wsWindowVisibility(&guiApp.mainWindow, wsShowWindow); mainVisible = True; /* adjust video window */ if (guiApp.video.Bitmap.Image) { wsImageResize(&guiApp.videoWindow, guiApp.video.Bitmap.Width, guiApp.video.Bitmap.Height); wsImageRender(&guiApp.videoWindow, guiApp.video.Bitmap.Image); } if (!guiInfo.Playing) { if (!guiApp.videoWindow.isFullScreen) { wsWindowResize(&guiApp.videoWindow, guiApp.video.width, guiApp.video.height); wsWindowMove(&guiApp.videoWindow, False, guiApp.video.x, guiApp.video.y); } wsWindowRedraw(&guiApp.videoWindow); } /* reload playbar */ if (was_playbar) uiPlaybarDone(); uiPlaybarInit(); /* reload menu window */ if (was_menu) uiMenuDone(); uiMenuInit(); /* */ if (guiInfo.AudioPassthrough) btnSet(evSetVolume, btnDisabled); if (guiInfo.AudioChannels < 2 || guiInfo.AudioPassthrough) btnSet(evSetBalance, btnDisabled); btnSet(evFullScreen, guiApp.videoWindow.isFullScreen ? btnPressed : btnReleased); wsWindowLayer(wsDisplay, guiApp.mainWindow.WindowID, guiApp.videoWindow.isFullScreen); wsWindowLayer(wsDisplay, guiApp.menuWindow.WindowID, guiApp.videoWindow.isFullScreen); }