summaryrefslogtreecommitdiffstats
path: root/gui/win32/gui.c
diff options
context:
space:
mode:
Diffstat (limited to 'gui/win32/gui.c')
-rw-r--r--gui/win32/gui.c1551
1 files changed, 1551 insertions, 0 deletions
diff --git a/gui/win32/gui.c b/gui/win32/gui.c
new file mode 100644
index 0000000000..d079c82c5e
--- /dev/null
+++ b/gui/win32/gui.c
@@ -0,0 +1,1551 @@
+/*
+ MPlayer Gui for win32
+ Copyright (c) 2003 Sascha Sommer <saschasommer@freenet.de>
+ Copyright (c) 2006 Erik Augustson <erik_27can@yahoo.com>
+ Copyright (c) 2006 Gianluigi Tiesi <sherpya@netfarm.it>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02111-1307 USA
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <fcntl.h>
+#include <windows.h>
+#include <windowsx.h>
+#include <shlobj.h>
+#include <version.h>
+#include <mplayer.h>
+#include <mp_fifo.h>
+#include <mp_msg.h>
+#include <help_mp.h>
+#include <input/input.h>
+#include <input/mouse.h>
+#include <osdep/keycodes.h>
+#include <stream/stream.h>
+#include <libvo/video_out.h>
+#include <interface.h>
+#include "gui.h"
+#include "wincfg.h"
+#include "dialogs.h"
+
+// HACK around bug in old mingw
+#undef INVALID_FILE_ATTRIBUTES
+#define INVALID_FILE_ATTRIBUTES ((DWORD)-1)
+
+#ifndef WM_XBUTTONDOWN
+# define WM_XBUTTONDOWN 0x020B
+# define WM_XBUTTONUP 0x020C
+# define WM_XBUTTONDBLCLK 0x020D
+#endif
+
+/* Globals / Externs */
+extern void renderinfobox(skin_t *skin, window_priv_t *priv);
+extern void renderwidget(skin_t *skin, image *dest, widget *item, int state);
+extern void mplayer_put_key(int code);
+extern void print_version(void);
+extern int WinID;
+float sub_aspect;
+
+DWORD oldtime;
+NOTIFYICONDATA nid;
+int console_state = 0;
+play_tree_t *playtree = NULL;
+
+static HBRUSH colorbrush = NULL; //Handle to colorkey brush
+static COLORREF windowcolor = RGB(255,0,255); //Windowcolor == colorkey
+
+void console_toggle(void)
+{
+ if (console_state)
+ {
+ FreeConsole();
+ console = 0;
+ console_state = 0;
+ }
+ else
+ {
+ /* This code comes from: http://dslweb.nwnexus.com/~ast/dload/guicon.htm */
+ CONSOLE_SCREEN_BUFFER_INFO coninfo;
+ FILE *fp;
+ HWND hwnd = NULL;
+ console = 1;
+ AllocConsole();
+ SetConsoleTitle(MP_TITLE);
+
+ /* disable the close button for now */
+ while (!hwnd)
+ {
+ hwnd = FindWindow(NULL, MP_TITLE);
+ Sleep(100);
+ }
+ DeleteMenu(GetSystemMenu(hwnd, 0), SC_CLOSE, MF_BYCOMMAND);
+
+ GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
+ coninfo.dwSize.Y = 1000;
+ SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize);
+ fp = freopen("con", "w", stdout);
+ *stdout = *fp;
+ setvbuf(stdout, NULL, _IONBF, 0);
+ fp = freopen("con", "r", stdin);
+ *stdin = *fp;
+ setvbuf(stdin, NULL, _IONBF, 0);
+ fp = freopen("con", "w", stdout);
+ *stderr = *fp;
+ setvbuf(stderr, NULL, _IONBF, 0);
+ print_version();
+ console_state = 1;
+ }
+}
+
+void capitalize(char *filename)
+{
+ unsigned int i;
+ BOOL cap = TRUE;
+ for (i=0; i < strlen(filename); i++)
+ {
+ if (cap)
+ {
+ cap = FALSE;
+ filename[i] = toupper(filename[i]);
+ }
+ else if (filename[i] == ' ')
+ cap = TRUE;
+ else
+ filename[i] = tolower(filename[i]);
+ }
+}
+
+static image *get_drawground(HWND hwnd)
+{
+ gui_t * gui = (gui_t *) GetWindowLongPtr(hwnd, GWLP_USERDATA);
+ unsigned int i;
+ if(!gui) return NULL;
+ for(i=0; i<gui->window_priv_count; i++)
+ if(gui->window_priv[i]->hwnd==hwnd)
+ return &gui->window_priv[i]->img;
+ return NULL;
+}
+
+static HBITMAP get_bitmap(HWND hwnd)
+{
+ gui_t *gui = (gui_t *) GetWindowLongPtr(hwnd, GWLP_USERDATA);
+ unsigned int i;
+ if(!gui) return NULL;
+ for(i=0; i<gui->window_priv_count; i++)
+ if(gui->window_priv[i]->hwnd == hwnd)
+ return gui->window_priv[i]->bitmap;
+ return NULL;
+}
+
+static int get_windowtype(HWND hwnd)
+{
+ gui_t *gui = (gui_t *) GetWindowLongPtr(hwnd, GWLP_USERDATA);
+ unsigned int i;
+ if(!gui) return -1;
+ for(i=0; i<gui->window_priv_count; i++)
+ if(gui->window_priv[i]->hwnd == hwnd)
+ return gui->window_priv[i]->type;
+ return -1;
+}
+
+static void uninit(gui_t *gui)
+{
+ if(gui->skin) destroy_window(gui);
+ if(gui->playlist) gui->playlist->free_playlist(gui->playlist);
+ gui->playlist = NULL;
+}
+
+/*
+ the gui message handler
+ tries to handle the incoming messages
+ and passes them to the player's message handler if it can't handle them
+*/
+static void handlemsg(HWND hWnd, int msg)
+{
+ gui_t *gui = (gui_t *) GetWindowLongPtr(hWnd, GWLP_USERDATA);
+ if(msg == evNone) return;
+
+ switch(msg)
+ {
+ case evLoadPlay:
+ case evLoad:
+ if(display_openfilewindow(gui, 0) && (msg == evLoadPlay))
+ handlemsg(hWnd, evDropFile);
+ return;
+ case evLoadSubtitle:
+ display_opensubtitlewindow(gui);
+ break;
+ case evPreferences:
+ display_prefswindow(gui);
+ return;
+ case evPlayList:
+ display_playlistwindow(gui);
+ return;
+ case evSkinBrowser:
+ display_skinbrowser(gui);
+ break;
+ case evEqualizer:
+ display_eqwindow(gui);
+ break;
+ case evAbout:
+ MessageBox(hWnd, COPYRIGHT, "About", MB_OK);
+ break;
+ case evIconify:
+ ShowWindow(hWnd, SW_MINIMIZE);
+ break;
+ case evIncVolume:
+ mplayer_put_key(KEY_VOLUME_UP);
+ break;
+ case evDecVolume:
+ mplayer_put_key(KEY_VOLUME_DOWN);
+ break;
+ default:
+ mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] received msg %s (%i)\n", gui->skin->geteventname(msg), msg);
+ break;
+ }
+ gui->playercontrol(msg);
+}
+
+static widget *clickedinsidewidget(gui_t *gui, int window, int x, int y)
+{
+ unsigned int i;
+ widget *item;
+ for(i=0; i<gui->skin->widgetcount; i++)
+ {
+ item = gui->skin->widgets[i];
+ if((item->window == window) && (item->x <= x) && (item->x + item->width >= x) &&
+ (item->y <= y) && (item->y + item->height >= y))
+ return item;
+ }
+ return NULL;
+}
+
+/* updates sliders and the display */
+static void updatedisplay(gui_t *gui, HWND hwnd)
+{
+ unsigned int i;
+ window_priv_t *priv = NULL;
+ DWORD time = timeGetTime();
+
+ if(!hwnd) return;
+
+ /* load all potmeters hpotmeters */
+ for(i=0; i<gui->skin->widgetcount; i++)
+ {
+ if(gui->skin->widgets[i]->type == tyHpotmeter || gui->skin->widgets[i]->type == tyPotmeter)
+ {
+ if(gui->skin->widgets[i]->msg == evSetVolume)
+ gui->skin->widgets[i]->value = guiIntfStruct.Volume;
+ else if(gui->skin->widgets[i]->msg == evSetMoviePosition)
+ gui->skin->widgets[i]->value = guiIntfStruct.Position;
+ else if(gui->skin->widgets[i]->msg == evSetBalance)
+ gui->skin->widgets[i]->value = guiIntfStruct.Balance;
+ if(gui->skin->widgets[i]->window == get_windowtype(hwnd))
+ renderwidget(gui->skin, get_drawground(hwnd), gui->skin->widgets[i],
+ gui->skin->widgets[i]->pressed ? 0 : 1);
+ }
+ /* update some buttons */
+ if(gui->skin->widgets[i]->type == tyButton && gui->skin->widgets[i]->window == get_windowtype(hwnd))
+ {
+ if(gui->skin->widgets[i]->msg == evPlaySwitchToPause)
+ {
+ gui->skin->widgets[i]->value = guiIntfStruct.Playing;
+ renderwidget(gui->skin, get_drawground(hwnd), gui->skin->widgets[i],
+ guiIntfStruct.Playing == 1 ? 0 : 1);
+ }
+ if(gui->skin->widgets[i]->msg == evMute)
+ {
+ gui->skin->widgets[i]->value = guiIntfStruct.Volume;
+ renderwidget(gui->skin, get_drawground(hwnd), gui->skin->widgets[i],
+ guiIntfStruct.Volume == 0.0f ? 0 : 1);
+ }
+ }
+ }
+
+ /* updating the display once a 100.second is enough imo */
+ if((time - oldtime) < 100) return;
+ oldtime=time;
+
+ /* suppress directx's fullscreen window when using the sub window */
+ if(sub_window && &video_driver_list[0] && strstr("directx", video_driver_list[0]))
+ {
+ HWND hWndFS = NULL; //handle to directx's fullscreen window
+ if(hWndFS == NULL)
+ {
+ hWndFS = FindWindow(NULL, "MPlayer Fullscreen");
+ if(hWndFS != NULL) DestroyWindow(hWndFS); //sub window handles fullscreen
+ }
+ }
+
+ for (i=0; i<gui->window_priv_count; i++)
+ {
+ if(gui->window_priv[i]->hwnd == hwnd)
+ priv=gui->window_priv[i];
+ }// Sherpya
+ /* display the status msgs */
+ renderinfobox(gui->skin, priv);
+ RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE);
+}
+
+static LRESULT CALLBACK SubProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ gui_t *gui = (gui_t *) GetWindowLongPtr(hWnd, GWLP_USERDATA);
+ if (gui && (gui->subwindow != hWnd)) return FALSE;
+
+ switch (message)
+ {
+ case WM_CLOSE:
+ handlemsg(hWnd, evExit);
+ return 0;
+ case WM_DESTROY:
+ PostQuitMessage(0);
+ return 0;
+ case WM_KEYDOWN:
+ {
+ switch(wParam)
+ {
+ case VK_LEFT:
+ mplayer_put_key(KEY_LEFT);
+ break;
+ case VK_UP:
+ mplayer_put_key(KEY_UP);
+ break;
+ case VK_RIGHT:
+ mplayer_put_key(KEY_RIGHT);
+ break;
+ case VK_DOWN:
+ mplayer_put_key(KEY_DOWN);
+ break;
+ case VK_TAB:
+ mplayer_put_key(KEY_TAB);
+ break;
+ case VK_BACK:
+ mplayer_put_key(KEY_BS);
+ break;
+ case VK_DELETE:
+ mplayer_put_key(KEY_DELETE);
+ break;
+ case VK_INSERT:
+ mplayer_put_key(KEY_INSERT);
+ break;
+ case VK_HOME:
+ mplayer_put_key(KEY_HOME);
+ break;
+ case VK_END:
+ mplayer_put_key(KEY_END);
+ break;
+ case VK_PRIOR:
+ mplayer_put_key(KEY_PAGE_UP);
+ break;
+ case VK_NEXT:
+ mplayer_put_key(KEY_PAGE_DOWN);
+ break;
+ case VK_ESCAPE:
+ mplayer_put_key(KEY_ESC);
+ break;
+ }
+ break;
+ }
+ case WM_COMMAND:
+ {
+ switch(LOWORD(wParam))
+ {
+ case IDEXIT:
+ PostQuitMessage(0);
+ handlemsg(hWnd, evExit);
+ break;
+ case IDFILE_OPEN:
+ handlemsg(hWnd, evLoadPlay);
+ break;
+ case IDURL_OPEN:
+ display_openurlwindow(gui, 0);
+ break;
+ case IDDIR_OPEN:
+ {
+ static char path[MAX_PATH];
+ BROWSEINFO bi;
+ LPITEMIDLIST pidl;
+ memset(&bi, 0, sizeof(BROWSEINFO));
+ bi.lpszTitle = "Choose a Directory...";
+ pidl = SHBrowseForFolder(&bi);
+ if (SHGetPathFromIDList(pidl, path))
+ {
+ gui->playlist->clear_playlist(gui->playlist);
+ adddirtoplaylist(gui->playlist, path, TRUE);
+ gui->startplay(gui);
+ }
+ break;
+ }
+ case ID_PTRACK:
+ handlemsg(hWnd, evPrev);
+ break;
+ case ID_SEEKB:
+ handlemsg(hWnd, evBackward10sec);
+ break;
+ case ID_PLAY:
+ handlemsg(hWnd, evPlaySwitchToPause);
+ break;
+ case ID_STOP:
+ handlemsg(hWnd, evStop);
+ break;
+ case ID_SEEKF:
+ handlemsg(hWnd, evForward10sec);
+ break;
+ case ID_NTRACK:
+ handlemsg(hWnd, evNext);
+ break;
+#ifdef USE_DVDREAD
+ case ID_CHAPTERSEL:
+ display_chapterselwindow(gui);
+ break;
+#endif
+ case ID_FULLSCREEN:
+ mp_input_queue_cmd(mp_input_parse_cmd("vo_fullscreen"));
+ break;
+ case ID_MUTE:
+ mp_input_queue_cmd(mp_input_parse_cmd("mute"));
+ break;
+ case ID_ASPECT1:
+ mp_input_queue_cmd(mp_input_parse_cmd("switch_ratio 1.777777"));
+ break;
+ case ID_ASPECT2:
+ mp_input_queue_cmd(mp_input_parse_cmd("switch_ratio 1.333333"));
+ break;
+ case ID_ASPECT3:
+ mp_input_queue_cmd(mp_input_parse_cmd("switch_ratio 2.35"));
+ break;
+ case ID_ASPECT4:
+ mp_input_queue_cmd(mp_input_parse_cmd("switch_ratio 0"));
+ break;
+ case IDSUB_TOGGLE:
+ mp_input_queue_cmd(mp_input_parse_cmd("sub_visibility"));
+ break;
+ case IDSUB_CYCLE:
+ mp_input_queue_cmd(mp_input_parse_cmd("sub_select"));
+ break;
+ }
+ return 0;
+ }
+ case WM_CHAR:
+ mplayer_put_key(wParam);
+ break;
+ case WM_DROPFILES:
+ {
+ if(!lParam)
+ {
+ char file[MAX_PATH];
+ int filecount = DragQueryFile((HDROP) wParam, -1, file, MAX_PATH);
+ int i;
+ for(i=0; i<filecount; i++)
+ {
+ DragQueryFile((HDROP) wParam, i, file, MAX_PATH);
+ mplSetFileName(NULL, file, STREAMTYPE_FILE);
+ if(!parse_filename(file, playtree, mconfig, 1))
+ gui->playlist->add_track(gui->playlist, file, NULL, NULL, 0);
+ }
+ DragFinish((HDROP) wParam);
+ handlemsg(hWnd, evDropFile);
+ }
+ else
+ {
+ gui->playlist->clear_playlist(gui->playlist);
+ gui->playlist->add_track(gui->playlist, (const char *) wParam, NULL, NULL, 0);
+ handlemsg(hWnd, evDropFile);
+ }
+ SetForegroundWindow(gui->subwindow);
+ return 0;
+ }
+ case WM_LBUTTONDOWN:
+ {
+ if(!vo_nomouse_input)
+ mplayer_put_key(MOUSE_BTN0);
+ break;
+ }
+ case WM_MBUTTONDOWN:
+ {
+ if(!vo_nomouse_input)
+ mplayer_put_key(MOUSE_BTN1);
+ break;
+ }
+ case WM_RBUTTONDOWN:
+ {
+ POINT point;
+ point.x = GET_X_LPARAM(lParam);
+ point.y = GET_Y_LPARAM(lParam);
+ ClientToScreen(hWnd, &point);
+ if(guiIntfStruct.StreamType == STREAMTYPE_DVD)
+ EnableMenuItem(gui->dvdmenu, ID_CHAPTERSEL, MF_BYCOMMAND | MF_ENABLED);
+ TrackPopupMenu(gui->submenu, 0, point.x, point.y, 0, hWnd, NULL);
+ return 0;
+ }
+ case WM_LBUTTONDBLCLK:
+ {
+ if(!vo_nomouse_input)
+ mplayer_put_key(MOUSE_BTN0_DBL);
+ break;
+ }
+ case WM_MBUTTONDBLCLK:
+ {
+ if(!vo_nomouse_input)
+ mplayer_put_key(MOUSE_BTN1_DBL);
+ break;
+ }
+ case WM_RBUTTONDBLCLK:
+ {
+ if(!vo_nomouse_input)
+ mplayer_put_key(MOUSE_BTN2_DBL);
+ break;
+ }
+ case WM_MOUSEWHEEL:
+ {
+ int x = GET_WHEEL_DELTA_WPARAM(wParam);
+ if(vo_nomouse_input)
+ break;
+ if (x > 0)
+ mplayer_put_key(MOUSE_BTN3);
+ else
+ mplayer_put_key(MOUSE_BTN4);
+ break;
+ }
+ case WM_XBUTTONDOWN:
+ {
+ if(vo_nomouse_input)
+ break;
+ if(HIWORD(wParam) == 1)
+ mplayer_put_key(MOUSE_BTN5);
+ else
+ mplayer_put_key(MOUSE_BTN6);
+ break;
+ }
+ case WM_XBUTTONDBLCLK:
+ {
+ if(vo_nomouse_input)
+ break;
+ if(HIWORD(wParam) == 1)
+ mplayer_put_key(MOUSE_BTN5_DBL);
+ else
+ mplayer_put_key(MOUSE_BTN6_DBL);
+ break;
+ }
+ case WM_TIMER:
+ {
+ if(fullscreen) while(ShowCursor(FALSE) >= 0){}
+ KillTimer(hWnd, ID_TIMER);
+ return 0;
+ }
+ case WM_MOUSEMOVE:
+ {
+ ShowCursor(TRUE);
+ SetTimer(hWnd, ID_TIMER, 3000, (TIMERPROC) NULL);
+ break;
+ }
+ case WM_WINDOWPOSCHANGED:
+ {
+ int tmpheight=0;
+ static uint32_t rect_width;
+ static uint32_t rect_height;
+ RECT rd;
+ POINT pt;
+ pt.x = 0;
+ pt.y = 0;
+ GetClientRect(hWnd, &rd);
+ ClientToScreen(hWnd, &pt);
+
+ rect_width = rd.right - rd.left;
+ rect_height = rd.bottom - rd.top;
+
+ /* maintain our aspect ratio */
+ tmpheight = ((float)rect_width/sub_aspect);
+ tmpheight += tmpheight % 2;
+ if(tmpheight > rect_height)
+ {
+ rect_width = ((float)rect_height*sub_aspect);
+ rect_width += rect_width % 2;
+ }
+ else rect_height = tmpheight;
+
+ rd.right = rd.left + rect_width;
+ rd.bottom = rd.top + rect_height;
+
+ AdjustWindowRect(&rd, WS_OVERLAPPEDWINDOW | WS_SIZEBOX, 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, SWP_NOOWNERZORDER);
+ SetForegroundWindow(hWnd);
+ return 0;
+ }
+ case WM_SYSCOMMAND:
+ {
+ switch(wParam)
+ {
+ case SC_SCREENSAVE:
+ case SC_MONITORPOWER:
+ mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>killing screensaver\n" );
+ return 0;
+ }
+ break;
+ }
+ case WM_PAINT:
+ {
+ PAINTSTRUCT ps;
+ RECT rect;
+ HDC hdc = BeginPaint(hWnd, &ps);
+ HDC hMemDC = CreateCompatibleDC(hdc);
+ HBRUSH blackbrush = (HBRUSH)GetStockObject(BLACK_BRUSH);
+ int width, height;
+ GetClientRect(hWnd, &rect);
+ width = rect.right - rect.left;
+ height = rect.bottom - rect.top;
+ if(guiIntfStruct.Playing == 0)
+ {
+ int i;
+ window *desc = NULL;
+
+ for (i=0; i<gui->skin->windowcount; i++)
+ if(gui->skin->windows[i]->type == wiSub)
+ desc = gui->skin->windows[i];
+
+ SelectObject(hMemDC, get_bitmap(hWnd));
+ StretchBlt(hdc, 0, 0, width, height, hMemDC, 0, 0, desc->base->bitmap[0]->width,
+ desc->base->bitmap[0]->height, SRCCOPY);
+ } else {
+ FillRect(GetDC(hWnd), &rect, fullscreen?blackbrush:colorbrush);
+ }
+ DeleteDC(hMemDC);
+ EndPaint(hWnd, &ps);
+ return 0;
+ }
+ }
+ return DefWindowProc(hWnd, message, wParam, lParam);
+}
+
+/* Window Proc for the gui Window */
+static LRESULT CALLBACK EventProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ gui_t *gui = (gui_t *) GetWindowLongPtr(hWnd, GWLP_USERDATA);
+
+ /* Avoid processing when then window doesn't match gui mainwindow */
+ if (gui && (gui->mainwindow != hWnd)) return FALSE;
+
+ switch (message)
+ {
+ case WM_CLOSE:
+ handlemsg(hWnd, evExit);
+ return 0;
+ case WM_DESTROY:
+ PostQuitMessage(0);
+ return 0;
+ case WM_SYSTRAY:
+ {
+ switch(lParam)
+ {
+ POINT cursor;
+ case WM_RBUTTONDOWN:
+ {
+ GetCursorPos(&cursor);
+ SetForegroundWindow(hWnd);
+ TrackPopupMenu(gui->traymenu, 0, cursor.x, cursor.y, 0, hWnd, NULL);
+ break;
+ }
+ case WM_MBUTTONDBLCLK:
+ case WM_LBUTTONDBLCLK:
+ {
+ if(IsWindowVisible(hWnd)) ShowWindow(hWnd, SW_HIDE);
+ else { ShowWindow(hWnd, SW_SHOW); SetForegroundWindow(hWnd); }
+ break;
+ }
+ }
+ break;
+ }
+ case WM_KEYDOWN:
+ {
+ switch(wParam)
+ {
+ case VK_LEFT:
+ mplayer_put_key(KEY_LEFT);
+ break;
+ case VK_UP:
+ mplayer_put_key(KEY_UP);
+ break;
+ case VK_RIGHT:
+ mplayer_put_key(KEY_RIGHT);
+ break;
+ case VK_DOWN:
+ mplayer_put_key(KEY_DOWN);
+ break;
+ case VK_TAB:
+ mplayer_put_key(KEY_TAB);
+ break;
+ case VK_BACK:
+ mplayer_put_key(KEY_BS);
+ break;
+ case VK_DELETE:
+ mplayer_put_key(KEY_DELETE);
+ break;
+ case VK_INSERT:
+ mplayer_put_key(KEY_INSERT);
+ break;
+ case VK_HOME:
+ mplayer_put_key(KEY_HOME);
+ break;
+ case VK_END:
+ mplayer_put_key(KEY_END);
+ break;
+ case VK_PRIOR:
+ mplayer_put_key(KEY_PAGE_UP);
+ break;
+ case VK_NEXT:
+ mplayer_put_key(KEY_PAGE_DOWN);
+ break;
+ case VK_ESCAPE:
+ mplayer_put_key(KEY_ESC);
+ break;
+ }
+ break;
+ }
+ case WM_CHAR:
+ mplayer_put_key(wParam);
+ break;
+ case WM_COPYDATA:
+ {
+ if(lParam)
+ {
+ PCOPYDATASTRUCT cdData;
+ cdData = (PCOPYDATASTRUCT) lParam;
+ mplSetFileName(NULL, cdData->lpData, STREAMTYPE_FILE);
+ if(!parse_filename(cdData->lpData, playtree, mconfig, 1))
+ gui->playlist->add_track(gui->playlist, cdData->lpData, NULL, NULL, 0);
+ gui->startplay(gui);
+ }
+ break;
+ }
+ case WM_DROPFILES:
+ {
+ if(!lParam)
+ {
+ char file[MAX_PATH];
+ int filecount = DragQueryFile((HDROP) wParam, -1, file, MAX_PATH);
+ int i;
+ for(i=0; i<filecount; i++)
+ {
+ DragQueryFile((HDROP) wParam, i, file, MAX_PATH);
+ mplSetFileName(NULL, file, STREAMTYPE_FILE);
+ if(!parse_filename(file, playtree, mconfig, 1))
+ gui->playlist->add_track(gui->playlist, file, NULL, NULL, 0);
+ }
+ DragFinish((HDROP) wParam);
+ handlemsg(hWnd, evDropFile);
+ }
+ else
+ {
+ gui->playlist->clear_playlist(gui->playlist);
+ gui->playlist->add_track(gui->playlist, (const char *) wParam, NULL, NULL, 0);
+ handlemsg(hWnd, evDropFile);
+ }
+ SetForegroundWindow(gui->mainwindow);
+ return 0;
+ }
+ case WM_LBUTTONDOWN:
+ {
+ SetCapture(hWnd);
+ gui->mousex = GET_X_LPARAM(lParam);
+ gui->mousey = GET_Y_LPARAM(lParam);
+ /* inside a widget */
+ gui->activewidget = clickedinsidewidget(gui, get_windowtype(hWnd), gui->mousex, gui->mousey);
+ if(gui->activewidget)
+ {
+ gui->activewidget->pressed = 1;
+ gui->mousewx = gui->mousex - gui->activewidget->x;
+ gui->mousewy = gui->mousey - gui->activewidget->y;
+ renderwidget(gui->skin, get_drawground(hWnd), gui->activewidget, 0);
+ RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE);
+ handlemsg(hWnd, gui->activewidget->msg);
+ }
+ break;
+ }
+ case WM_CAPTURECHANGED:
+ {
+ if(gui->activewidget)
+ {
+ gui->activewidget->pressed = 0;
+ renderwidget(gui->skin, get_drawground(hWnd), gui->activewidget, 1);
+ RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE);
+ gui->activewidget = NULL;
+ }
+ break;
+ }
+ case WM_LBUTTONUP:
+ {
+ ReleaseCapture();
+ if(gui->activewidget)
+ {
+ gui->activewidget->pressed = 0;
+ renderwidget(gui->skin, get_drawground(hWnd), gui->activewidget, 1);
+ RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE);
+ gui->activewidget = NULL;
+ }
+ break;
+ }
+ case WM_RBUTTONDOWN:
+ {
+ POINT point;
+ char device[MAX_PATH];
+ char searchpath[MAX_PATH];
+ char searchpath2[MAX_PATH];
+#ifdef HAVE_LIBCDIO
+ char searchpath3[MAX_PATH];
+#endif
+ int len, pos = 0, cdromdrive = 0;
+ UINT errmode;
+ point.x = GET_X_LPARAM(lParam);
+ point.y = GET_Y_LPARAM(lParam);
+ ClientToScreen(hWnd, &point);
+ errmode = SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX);
+ while (GetMenuItemCount(gui->diskmenu) > 0)
+ DeleteMenu(gui->diskmenu, 0, MF_BYPOSITION);
+ len = GetLogicalDriveStrings(MAX_PATH, device);
+ while(pos < len)
+ {
+ if(GetDriveType(device + pos) == DRIVE_CDROM)
+ {
+ char volname[MAX_PATH];
+ char menuitem[MAX_PATH];
+ int flags = MF_STRING;
+ mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] checking %s for CD/VCD/SVCD/DVDs\n", device + pos);
+ sprintf(searchpath, "%sVIDEO_TS", device + pos);
+ sprintf(searchpath2, "%sMpegav", device + pos);
+#ifdef HAVE_LIBCDIO
+ sprintf(searchpath3, "%sTrack01.cda", device + pos);
+#endif
+ if(GetFileAttributes(searchpath) != INVALID_FILE_ATTRIBUTES)
+ flags |= MF_ENABLED;
+ else if(GetFileAttributes(searchpath2) != INVALID_FILE_ATTRIBUTES)
+ flags |= MF_ENABLED;
+#ifdef HAVE_LIBCDIO
+ else if(GetFileAttributes(searchpath3) != INVALID_FILE_ATTRIBUTES)
+ flags |= MF_ENABLED;
+#endif
+ else
+ flags |= MF_GRAYED;
+ volname[0] = 0;
+ strcpy(menuitem, device + pos);
+ menuitem[strlen(menuitem) - 1]=0;
+ GetVolumeInformation(device + pos, volname, MAX_PATH, NULL, NULL, NULL, NULL, 0);
+ if (strlen(volname))
+ {
+ capitalize(volname);
+ strcat(menuitem, " - ");
+ strcat(menuitem, volname);
+ }
+ AppendMenu(gui->diskmenu, flags, IDPLAYDISK + cdromdrive, menuitem);
+ cdromdrive++;
+ }
+ pos += strlen(device + pos) + 1;
+ }
+ SetErrorMode(errmode);
+ TrackPopupMenu(gui->menu, 0, point.x, point.y, 0, hWnd, NULL);
+ return 0;
+ }
+ case WM_MOUSEMOVE:
+ {
+ if(wParam & MK_LBUTTON)
+ {
+ POINT point;
+ RECT rect;
+ if(gui->activewidget)
+ {
+ widget *item = gui->activewidget;
+
+ if(item->type == tyHpotmeter)
+ {
+ item->x = GET_X_LPARAM(lParam) - gui->mousewx;
+ item->value = (float)((float)((item->x - item->wx) * 100.0f) / (float)(item->wwidth - item->width));
+ }
+ if(item->type == tyPotmeter)
+ {
+ gui->mousewx = GET_X_LPARAM(lParam) - gui->activewidget->x;
+ item->value = (float) (gui->mousewx * 100.0f) / (float) item->wwidth;
+ }
+
+ if((item->type == tyPotmeter) || (item->type == tyHpotmeter) || (item->type == tyVpotmeter))
+ {
+ /* Bound checks */
+ if(item->value > 100.0f)
+ item->value = 100.0f;
+ else if(item->value < 0.0f)
+ item->value = 0.0f;
+
+ if(item->msg == evSetVolume)
+ guiIntfStruct.Volume = (float) item->value;
+ else if(item->msg == evSetMoviePosition)
+ guiIntfStruct.Position = (float) item->value;
+ else if(item->msg == evSetBalance)
+ {
+ /* make the range for 50% a bit bigger, because the sliders for balance usually suck */
+ if((item->value - 50.0f < 1.5f) && (item->value - 50.0f > -1.5f))
+ item->value = 50.0f;
+ guiIntfStruct.Balance = (float) item->value;
+ }
+ updatedisplay(gui, hWnd);
+ handlemsg(hWnd, item->msg);
+ }
+ break;
+ }
+ point.x = GET_X_LPARAM(lParam);
+ point.y = GET_Y_LPARAM(lParam);
+ ClientToScreen(hWnd, &point);
+ GetWindowRect(hWnd, &rect);
+ MoveWindow(hWnd, point.x - gui->mousex, point.y - gui->mousey,
+ rect.right-rect.left,rect.bottom-rect.top,TRUE);
+ break;
+ }
+ break;
+ }
+ case WM_COMMAND:
+ {
+ switch(LOWORD(wParam))
+ {
+ case IDEXIT:
+ PostQuitMessage(0);
+ handlemsg(hWnd, evExit);
+ break;
+ case IDFILE_OPEN:
+ handlemsg(hWnd, evLoadPlay);
+ break;
+ case IDDIR_OPEN:
+ {
+ static char path[MAX_PATH];
+ BROWSEINFO bi;
+ LPITEMIDLIST pidl;
+ memset(&bi, 0, sizeof(BROWSEINFO));
+ bi.lpszTitle = "Choose a Directory...";
+ pidl = SHBrowseForFolder(&bi);
+ if (SHGetPathFromIDList(pidl, path))
+ {
+ gui->playlist->clear_playlist(gui->playlist);
+ adddirtoplaylist(gui->playlist, path, TRUE);
+ gui->startplay(gui);
+ }
+ break;
+ }
+ case ID_SKINBROWSER:
+ handlemsg(hWnd, evSkinBrowser);
+ break;
+ case IDURL_OPEN:
+ display_openurlwindow(gui, 0);
+ break;
+ case ID_MUTE:
+ mp_input_queue_cmd(mp_input_parse_cmd("mute"));
+ break;
+ case IDSUBTITLE_OPEN:
+ display_opensubtitlewindow(gui);
+ break;
+ case ID_PTRACK:
+ handlemsg(hWnd, evPrev);
+ break;
+ case ID_SEEKB:
+ handlemsg(hWnd, evBackward10sec);
+ break;
+ case ID_PLAY:
+ handlemsg(hWnd, evPlaySwitchToPause);
+ break;
+ case ID_STOP:
+ handlemsg(hWnd, evStop);
+ break;
+ case ID_SEEKF:
+ handlemsg(hWnd, evForward10sec);
+ break;
+ case ID_NTRACK:
+ handlemsg(hWnd, evNext);
+ break;
+ case ID_SHOWHIDE:
+ {
+ if(IsWindowVisible(hWnd)) ShowWindow(hWnd, SW_HIDE);
+ else ShowWindow(hWnd, SW_SHOW);
+ break;
+ }
+ case ID_PLAYLIST:
+ handlemsg(hWnd, evPlayList);
+ break;
+ case ID_PREFS:
+ handlemsg(hWnd, evPreferences);
+ break;
+ case ID_CONSOLE:
+ console_toggle();
+ break;
+ case ID_ONLINEHELP:
+ ShellExecute(NULL, "open", ONLINE_HELP_URL, NULL, NULL, SW_SHOWNORMAL);
+ break;
+ }
+ if((IDPLAYDISK <= LOWORD(wParam)) && (LOWORD(wParam) < (IDPLAYDISK + 100)))
+ {
+ char device[MAX_PATH];
+ char searchpath[MAX_PATH];
+