Mercurial > mplayer.hg
changeset 19245:15b9a8cdea4c
improved fullscreen switching
author | vayne |
---|---|
date | Sat, 29 Jul 2006 19:30:38 +0000 |
parents | 5e5d323b1934 |
children | 3f6fad3b9d9c |
files | Gui/win32/gui.c Gui/win32/interface.c |
diffstat | 2 files changed, 56 insertions(+), 27 deletions(-) [+] |
line wrap: on
line diff
--- a/Gui/win32/gui.c Sat Jul 29 18:41:25 2006 +0000 +++ b/Gui/win32/gui.c Sat Jul 29 19:30:38 2006 +0000 @@ -64,10 +64,6 @@ NOTIFYICONDATA nid; int console_state = 0; -/* Sub window stuff */ -static HBRUSH colorbrush = NULL; //Handle to colorkey brush -static COLORREF windowcolor = RGB(0,0,16); //Windowcolor == colorkey - void console_toggle(void) { if (console_state) @@ -560,6 +556,7 @@ int tmpheight=0; static uint32_t rect_width; static uint32_t rect_height; + DWORD style, flags; RECT rd; POINT pt; while(ShowCursor(TRUE) <= 0){} @@ -584,9 +581,18 @@ rd.right = rd.left + rect_width; rd.bottom = rd.top + rect_height; - AdjustWindowRect(&rd, WS_OVERLAPPEDWINDOW | WS_SIZEBOX, 0); - SetWindowPos(hWnd, HWND_NOTOPMOST, pt.x+rd.left, pt.y+rd.top, - rd.right-rd.left, rd.bottom-rd.top, SWP_NOOWNERZORDER); + if(fullscreen) + { + style = WS_VISIBLE | WS_POPUP; + flags = SWP_NOZORDER | SWP_FRAMECHANGED; + } else { + style = WS_OVERLAPPEDWINDOW | WS_SIZEBOX; + flags = SWP_NOOWNERZORDER; + } + + AdjustWindowRect(&rd, style, 0); + SetWindowPos(hWnd, 0, fullscreen?0:pt.x+rd.left, fullscreen?0:pt.y+rd.top, + fullscreen?vo_screenwidth:rd.right-rd.left, fullscreen?vo_screenheight:rd.bottom-rd.top, flags); return 0; } case WM_PAINT: @@ -1325,6 +1331,7 @@ window_priv_t *priv = NULL; window *desc = NULL; int i, x = -1, y = -1; + vo_colorkey = 0xff000000; for (i=0; i<gui->skin->windowcount; i++) if(gui->skin->windows[i]->type == wiSub) @@ -1336,8 +1343,6 @@ return 1; } - windowcolor = vo_colorkey; - colorbrush = CreateSolidBrush(windowcolor); wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; wc.lpfnWndProc = SubProc; wc.cbClsExtra = 0; @@ -1345,7 +1350,7 @@ wc.hInstance = instance; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = gui->icon; - wc.hbrBackground = colorbrush; + wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); wc.lpszClassName = "MPlayer Sub for Windows"; wc.lpszMenuName = NULL; RegisterClass(&wc);
--- a/Gui/win32/interface.c Sat Jul 29 18:41:25 2006 +0000 +++ b/Gui/win32/interface.c Sat Jul 29 19:30:38 2006 +0000 @@ -67,6 +67,7 @@ int mplGotoTheNext = 1; static gui_t *mygui = NULL; static int update_subwindow(void); +static RECT old_rect; /* test for playlist files, no need to specify -playlist on the commandline. * add any conceivable playlist extensions here. @@ -402,6 +403,7 @@ if (mygui->playlist->current == (mygui->playlist->trackcount - 1)) mygui->playlist->current = 0; + fullscreen = vo_fs = 0; guiGetEvent(guiCEvent, (void *) guiSetStop); } @@ -432,6 +434,9 @@ gtkAutoSync = autosync; } + old_rect.left = gui_sub_pos_x; + old_rect.top = gui_sub_pos_y; + while(mygui) { GetMessage(&msg, NULL, 0, 0); @@ -665,6 +670,9 @@ case guiSetPlay: { guiIntfStruct.Playing = 1; + if(guiIntfStruct.sh_video && !IsIconic(mygui->subwindow) + && IsWindowVisible(mygui->subwindow) && !fullscreen) + GetWindowRect(mygui->subwindow, &old_rect); break; } case guiSetStop: @@ -690,22 +698,33 @@ case MP_CMD_GUI_FULLSCREEN: { if(!guiIntfStruct.sh_video) break; - video_out->control(VOCTRL_FULLSCREEN, 0); - /* no WinID, keep the sub window hidden */ - if(!sub_window) + /* FIXME: vo_directx is behaving unexpectedly, this maintains current functionality */ + if(!sub_window || (&video_driver_list && strstr(video_driver_list[0], "directx"))) + { + video_out->control(VOCTRL_FULLSCREEN, 0); break; + } - if(vo_fs) + if(!fullscreen) + GetWindowRect(mygui->subwindow, &old_rect); + + if(fullscreen) { - WinID = -1; - ShowWindow(mygui->subwindow, SW_HIDE); - while(ShowCursor(FALSE) >= 0){} + fullscreen = vo_fs = 0; + vo_dwidth = guiIntfStruct.MovieWidth = old_rect.right-old_rect.left; + vo_dheight = guiIntfStruct.MovieHeight = old_rect.bottom-old_rect.top; + vo_dx = old_rect.left; + vo_dy = old_rect.top; } else { - WinID = mygui->subwindow; - ShowWindow(mygui->subwindow, SW_SHOW); - while(ShowCursor(TRUE) <= 0){} + fullscreen = vo_fs = 1; + vo_dwidth = guiIntfStruct.MovieWidth = vo_screenwidth; + vo_dheight = guiIntfStruct.MovieHeight = vo_screenheight; + vo_dx = 0; + vo_dy = 0; } + mpcodecs_config_vo(guiIntfStruct.sh_video, guiIntfStruct.MovieWidth, + guiIntfStruct.MovieHeight, 0); break; } case MP_CMD_QUIT: @@ -723,24 +742,24 @@ guiGetEvent(guiCEvent, (void *) guiSetPlay); break; case MP_CMD_GUI_SKINBROWSER: - if(vo_fs) guiSetEvent(evFullScreen); + if(fullscreen) guiSetEvent(evFullScreen); PostMessage(mygui->mainwindow, WM_COMMAND, (WPARAM) ID_SKINBROWSER, 0); break; case MP_CMD_GUI_PLAYLIST: - if(vo_fs) guiSetEvent(evFullScreen); + if(fullscreen) guiSetEvent(evFullScreen); PostMessage(mygui->mainwindow, WM_COMMAND, (WPARAM) ID_PLAYLIST, 0); break; case MP_CMD_GUI_PREFERENCES: - if(vo_fs) guiSetEvent(evFullScreen); + if(fullscreen) guiSetEvent(evFullScreen); PostMessage(mygui->mainwindow, WM_COMMAND, (WPARAM) ID_PREFS, 0); break; case MP_CMD_GUI_LOADFILE: - if(vo_fs) guiSetEvent(evFullScreen); + if(fullscreen) guiSetEvent(evFullScreen); PostMessage(mygui->mainwindow, WM_COMMAND, (WPARAM) IDFILE_OPEN, 0); break; #ifdef USE_SUB case MP_CMD_GUI_LOADSUBTITLE: - if(vo_fs) guiSetEvent(evFullScreen); + if(fullscreen) guiSetEvent(evFullScreen); PostMessage(mygui->mainwindow, WM_COMMAND, (WPARAM) IDSUBTITLE_OPEN, 0); break; #endif @@ -926,7 +945,11 @@ ShowWindow(mygui->subwindow, SW_SHOWNORMAL); /* get our current window coordinates */ - GetWindowRect(mygui->subwindow, &rd); + if(fullscreen) + GetWindowRect(mygui->subwindow, &rd); + else + CopyRect(&rd, &old_rect); + x = rd.left; y = rd.top; @@ -952,8 +975,9 @@ sub_aspect = movie_aspect; } + AdjustWindowRect(&rd, WS_OVERLAPPEDWINDOW | WS_SIZEBOX, 0); - SetWindowPos(mygui->subwindow, HWND_NOTOPMOST, x, y, rd.right-rd.left, rd.bottom-rd.top, SWP_NOOWNERZORDER); + SetWindowPos(mygui->subwindow, 0, x, y, rd.right-rd.left, rd.bottom-rd.top, SWP_NOOWNERZORDER); wp.hwnd = mygui->subwindow; wp.x = rd.left;